[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как ограничить кол-во запусков одного скрипта
Altai
Здравствуйте! Есть скрипт, который очень долго выполняется. Ну например какой-то парсер. И нужно сделать так, чтоб его невозможно было запустить 2 раза одновременно. Как это можно реализовать? В гугле нашел такой способ:
flock(fopen("temp/lock.txt", "w+"), LOCK_EX) or die('Скрипт уже выполняется и ещё не завершил свою работу');

но он не помогает. Я ч-з аякс запускаю скрипт 2 раза, и 2 раза он начинает выполняться одновременно.
Может есть ещё какие-то способы ограничить повторный запуск скрипта?
Altai
Вопрос решен, всем спасибо за внимание
Valick
Цитата (Altai @ 18.10.2015 - 17:18)
Я ч-з аякс запускаю скрипт 2 раза, и 2 раза он начинает выполняться одновременно.

а вы не запускайте...

могу вам предложить алгоритм с применением БД (вам в любом случае прийдётся где-то хранить метку времени, и база данных самый лучший вариант)
в начале скрипта проверяем запущел ли скрипт или нет по метке в БД
изначально никаких меток нет, значит мы устанавливаем метку того что скипт запущен и только в конце скрипта мы эту метку удаляем или меняем
если нужна конкретная реализация, то можем договориться о цене через личку

_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Цитата (Altai @ 18.10.2015 - 22:19)
Вопрос решен, всем спасибо за внимание

по правилам "хорошего тона", не плохо бы рассказать о вашем варианте решения

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Altai @ 18.10.2015 - 18:18)
Может есть ещё какие-то способы ограничить повторный запуск скрипта?

Есть такая штука под названием "семафор". В ПХП я её не использовал никогда (не было потребности), но когда-то давно использовал в Си.
Читай подробнее в мануале http://php.net/manual/ru/book.sem.php

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
Цитата (sergeiss @ 18.10.2015 - 22:41)
Есть такая штука под названием "семафор"

sergeiss, он позволит организовать стек очерёдности запусков скрипта с ожиданием?


_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Valick @ 18.10.2015 - 23:44)
он позволит организовать стек очерёдности запусков скрипта с ожиданием

"Читай подробнее в мануале" (с) smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Altai
Цитата (Valick @ 18.10.2015 - 23:30)
по правилам "хорошего тона", не плохо бы рассказать о вашем варианте решения

Сделал как раз с помощью метки времени.

Вот собственно код этой части:
function myFunc(){
if(!file_exists("temp/lock.txt")) file_put_contents("temp/lock.txt", "unlock\r\n".time());
$lockData=file("temp/lock.txt");
if(trim($lockData[0])=="lock") if(time()-(int)$lockData[1]<=4) die('will_not_pass'); // запираем файл
file_put_contents("temp/lock.txt", "lock\r\n".time());

/* Исполняемый скрипт */

file_put_contents("temp/lock.txt", "unlock\r\n".time()); // отпираем файл
return myFunc();
}

Теперь в случае повторного запуска скрипта, сначала проверяем, заперт ли файл
if(trim($lockData[0])=="lock")
потом проверяем сколько прошло времени с последнего запирания
 if(time()-(int)$lockData[1]<=4)
и если файл заперт а время прошло менее 4 секунд - запрещаем данному скрипту выполняться.
Если же скрипт завершился из-за какой-то ошибки, типа превышение max_execution_time, а файл так и остался запертым - то на клиентской стороне стоит ява-скрипт, который с помощью ajax перезапускает его ч-з 5 секунд (от сюда и условие <=4 секунды). После нес-ких десятков тестов, скрипт ни разу не подвёл.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.