Останавливается ли выполнение php после того, как пользователь покидает страницу?
Я хочу запустить относительно трудоемкий скрипт, основанный на вводе какой-либо формы, но я бы предпочел не прибегать к cron, поэтому мне интересно, будет ли страница php, запрошенная через ajax, выполняться до завершения или она остановится, если пользователь покинет страницу.
На самом деле он не выводится в браузер до тех пор, пока в конце файла не появится код json_encode, так что все ли будет выполняться до этого?
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 снова не обнаружит, что соединение закрыто, и скрипт продолжит работу.
Фу.
Это зависит от ваших настроек - обычно это останавливается, но вы можете использовать ignore_user_abort()
чтобы это продолжалось.
В зависимости от конфигурации веб-сервера и/или PHP, процесс PHP может или не может прервать поток, когда пользователь завершает HTTP-соединение. Если запрос AJAX находится в ожидании, когда пользователь уходит со страницы, это зависит от того, что браузер отключит запрос (не гарантируется) поверх конфигурации вашего сервера (не гарантируется). Не тот ответ, который ты хочешь услышать!
Я бы рекомендовал создать рабочую очередь в неструктурированном файле или базе данных, которая постоянно работает Демон PHP может проводить опрос для заданий. Он не страдает от задержки cron
, но сохраняет использование процессора/памяти на приемлемом уровне. После завершения задания поместите результаты в плоский файл/базу данных для извлечения AJAX. Или пообещайте написать пользователю по электронной почте, как только работа будет завершена (мой предпочтительный метод).
Надеюсь, это поможет
Если клиент/пользователь/загрузчик/просмотрщик прервется или отключится, сценарий будет продолжать работать до тех пор, пока что-то не попытается сбросить новые данные с клиента. Если только вы не использовали
ignore_user_abort()
, сценарий там умрет.
В том же порядке PHP не может определить, находится ли клиент все еще там, не пытаясь сбросить какие-либо данные в httpd.
Нашел реальное решение для моего случая, когда соединение не прерывается. СЕАНС на моем сервере Apache/Php должен был завершиться до начала следующего.