Могут ли сценарии PHP продолжать работать, даже если пользователь закрыл браузер? - PullRequest
21 голосов
/ 02 ноября 2009

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

Ответы [ 7 ]

18 голосов
/ 02 ноября 2009

Если задача занимает 10 минут, не используйте браузер для ее непосредственного выполнения. У вас есть много других вариантов:

  • Используйте cronjob для выполнения задачи периодически.
  • есть браузер просьба вставить новую строку в таблица базы данных, так что регулярный cronjob может обработать новую строку и выполнить скрипт PHP с соответствующие аргументы
  • Есть запрос браузера написать сообщение система очередей, в которой есть подписчик прослушивание таких событий (которые затем выполняет скрипт).

Хотя некоторые из этих предложений, вероятно, излишни для вашей ситуации, ключевой функцией объединения является отсоединение запроса браузера от выполнения задания, чтобы его можно было выполнить асинхронно.

Если вам нужно, чтобы окно браузера обновлялось по мере выполнения, вам нужно будет использовать периодически выполняемый AJAX-запрос для получения статуса задания.

12 голосов
/ 02 ноября 2009

Чтобы ответить на ваш вопрос напрямую, см. ignore_user_abort

В более широком смысле, у вас, вероятно, здесь проблема с архитектурой.

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

6 голосов
/ 10 мая 2012

PHP-скрипт будет продолжать работать после того, как клиент прервет соединение (это не будет представлять угрозу безопасности), но только до max_execution_time (устанавливается в php.ini или через PHP-скрипт, обычно по умолчанию 30 секунд ) ..

Например:

<?php
    $fh = fopen("bluh.txt", 'w');
    for($i=0; $i<20; $i++) {
        echo $i."<br/>";
        fwrite($fh,$i."\n");
        sleep(1);
    }
    fclose($fh);
?>

Запустите его в своем браузере и закройте браузер до его завершения. Вы обнаружите, что через 20 секунд файл содержит все значения $i.

Измените верхнюю границу цикла for на 100 вместо 20, и вы обнаружите, что он работает только с 0 до 29. Из-за PHP max_execution_time сценарий отключается и умирает.

3 голосов
/ 02 ноября 2009

, если скрипт полностью основан на сервере (без обратной связи с пользователем), это будет сделано, даже если клиент закрыт.

Общая архитектура PHP такова, что клиенты отправляют запрос скрипту, который дает ответ пользователю. если пользователю ничего не возвращено, скрипт все равно будет выполняться, даже если пользователь больше не находится на другой стороне. Более просто: у них нет постоянной связи между сервером и клиентом по обычному сценарию.

1 голос
/ 02 ноября 2009

Вы можете запускать скрипт PHP каждые 20 минут, используя файл crontab, который содержит время и какую команду для запуска в этом случае это будет скрипт php.

0 голосов
/ 02 ноября 2009

Да. Сервер не знает, закрыл ли пользователь браузер. По крайней мере, он не сразу это замечает.

Нет: сервер, вероятно (в зависимости от того, как он настроен) не разрешит запуск сценария php в течение 10 минут. На дешевом виртуальном хостинге я бы не стал полагаться на то, что скрипт работает дольше, чем разумное время ответа.

0 голосов
/ 02 ноября 2009

Серверный скрипт будет работать независимо от того, что делает клиент.

РЕДАКТИРОВАТЬ: Кстати, вы уверены, что хотите, чтобы страницы открывались за 10 минут? Я предлагаю вам использовать очередь задач (элементы которой выполняются cron своевременно) и перенаправить пользователя на страницу «Хорошо, я нахожусь».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...