Останавливается ли выполнение php после того, как пользователь покидает страницу?


Я хочу запустить относительно трудоемкий скрипт, основанный на вводе какой-либо формы, но я бы предпочел не прибегать к cron, поэтому мне интересно, будет ли страница php, запрошенная через ajax, выполняться до завершения или она остановится, если пользователь покинет страницу.

На самом деле он не выводится в браузер до тех пор, пока в конце файла не появится код json_encode, так что все ли будет выполняться до этого?

Author: Stephen Belanger, 2009-08-15

5 answers

Это зависит от обстоятельств.

Из http://us3.php.net/manual/en/features.connection-handling.php:

Когда PHP-скрипт работает нормально , ОБЫЧНОЕ состояние является активным. Если удаленный клиент отключает ПРЕРВАННЫЙ государственный флаг включен. Отключение удаленного клиента обычно вызывается нажатием пользователем кнопки "СТОП".

Вы можете решить, хотите ли вы , чтобы отключение клиента привело к прерыванию вашего сценария. Иногда это так удобно, чтобы ваши сценарии всегда выполнялись до завершения, даже если удаленный браузер не получает выходные данные. Однако поведение по умолчанию заключается в том, что ваш сценарий будет прерван при отключении удаленного клиента. Это поведение может быть задано с помощью ignore_user_abort директива php.ini, а также через соответствующий php_value ignore_user_abort Директива Apache httpd.conf или с помощью ignore_user_abort() функция.

Это, по-видимому, говорит о том, что ответ на ваш вопрос: "Да, сценарий завершится, если пользователь покидает страницу".

Однако осознайте, что в зависимости от используемого серверного SAPI (например, mod_php), php не может обнаружить, что клиент прервал соединение, пока не будет предпринята попытка отправить информацию клиенту. Если ваш долго работающий скрипт не выдает flush(), скрипт может продолжать работать, даже если пользователь закрыл соединение.

Усложняет ситуацию, даже если вы делаете периодические вызовы flush(), имея вывод буферизация вкл. приведет к тому, что эти вызовы будут перехвачены и не будут отправлены клиенту, пока сценарий все равно не завершится!

Далее усложняет ситуацию то, что если вы установили обработчики Apache, которые буферизуют ответ (например, mod_gzip), то php снова не обнаружит, что соединение закрыто, и скрипт продолжит работу.

Фу.

 69
Author: Crescent Fresh, 2009-08-15 00:26:00

Это зависит от ваших настроек - обычно это останавливается, но вы можете использовать ignore_user_abort() чтобы это продолжалось.

 6
Author: Greg, 2009-08-14 21:28:48

В зависимости от конфигурации веб-сервера и/или PHP, процесс PHP может или не может прервать поток, когда пользователь завершает HTTP-соединение. Если запрос AJAX находится в ожидании, когда пользователь уходит со страницы, это зависит от того, что браузер отключит запрос (не гарантируется) поверх конфигурации вашего сервера (не гарантируется). Не тот ответ, который ты хочешь услышать!

Я бы рекомендовал создать рабочую очередь в неструктурированном файле или базе данных, которая постоянно работает Демон PHP может проводить опрос для заданий. Он не страдает от задержки cron, но сохраняет использование процессора/памяти на приемлемом уровне. После завершения задания поместите результаты в плоский файл/базу данных для извлечения AJAX. Или пообещайте написать пользователю по электронной почте, как только работа будет завершена (мой предпочтительный метод).

Надеюсь, это поможет

 1
Author: Al., 2009-08-14 21:35:25

Если клиент/пользователь/загрузчик/просмотрщик прервется или отключится, сценарий будет продолжать работать до тех пор, пока что-то не попытается сбросить новые данные с клиента. Если только вы не использовали ignore_user_abort(), сценарий там умрет. В том же порядке PHP не может определить, находится ли клиент все еще там, не пытаясь сбросить какие-либо данные в httpd.

 0
Author: Havenard, 2009-08-15 03:32:16

Нашел реальное решение для моего случая, когда соединение не прерывается. СЕАНС на моем сервере Apache/Php должен был завершиться до начала следующего.

Браузер ожидает завершения вызова ajax после прерывания.

 0
Author: Artistan, 2017-05-23 11:52:53