Как выполнять длительные задачи в PHP без cron - PullRequest
1 голос
/ 17 июня 2011

Давайте представим мою ситуацию (это, конечно, подделка) ...

У меня есть веб-сайт, на котором 1000 активных пользователей.Мне нужно сделать некоторые вещи, которые будут выполняться медленно (очистка базы данных, резервное копирование) и т. Д. Например, это может занять 5 минут.

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

Когда процесс выполняется - веб-сайт возвращает ему нормальное поведение.И все это происходит автоматически.

Возможно ли это без cron?

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Проверка Операторы исполнения . Они могут быть тем, что вы ищете. Как то так

$execute = `/path/to/php/script.php`;

// If you needed the output
echo $execute; 

После запуска этого сценария установите флаг (это может быть база данных или простая запись в файл или что-то в этом роде). Когда скрипт завершится, удалите этот флаг.

На всех других ваших страницах - отметьте этот флаг. Если он включен, отобразите сообщение.

0 голосов
/ 17 июня 2011

Вы можете использовать CURL для этой задачи. В базе данных или текстовом файле сохраните время последнего запуска сценария и один день в неделю запустите этот сценарий (конечно, дата обновления перед выполнением сценария):

$ ch = curl_init ();

curl_setopt ($ ch, CURLOPT_URL, "http://www.exaple.com/service_script.php");

curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($ ch, CURLOPT_TIMEOUT, 1);

$ result_curl = curl_exec ($ ch);

curl_close ($ ч);

0 голосов
/ 17 июня 2011

На вашей странице вы можете иметь значение базы данных, т.е. script_runninng, затем проверить, если значение = 0, отправить команду, если = 1, ничего не делать.Затем убедитесь, что вы установили значение 1 в начале и 0 в конце команды.

...