Будет ли скрипт работать даже после закрытия страницы?

если я вызываю php-файл через jquery ajax, который содержит скрипт для выполнения некоторых действий, которые требуют времени, например, для загрузки большого видео, а затем я закрываю страницу: скрипт php продолжает загружать видео или нет?

Related of "Будет ли скрипт работать даже после закрытия страницы?"

См. Здесь: http://php.net/manual/en/function.ignore-user-abort.php

Также есть опция конфигурации PHP с тем же именем: http://php.net/manual/en/misc.configuration.php

По умолчанию, если вы ничего не делаете, согласно руководству по PHP, по умолчанию используется прервать скрипт. http://php.net/manual/en/features.connection-handling.php

НЕОБХОДИМЫЕ ОБНОВЛЕНИЯ

Кажется, я (неосознанно) обманул свой путь к «точкам репутации», потому что я НЕ дал (правильный) ответ, но теперь он теперь благодаря тестированию и продолжению подталкивания от « mellamokb »:

Цитата : «Хорошо, я взглянул на исходный код PHP и, если ничего не пропустил, теперь у меня есть ответ. Флаг« ignore_user_abort »проверяется только тогда, когда PHP получает ошибку, пытающуюся вывести что-то пользователю Итак, в моем понимании, нет способа прервать код, который не производит никакого вывода ».

Хорошо, я не был полностью выключен, но важно знать, что все зависит от того, производил ли ваш скрипт какой-либо вывод!

Если вы прочитаете ЭТО, также ознакомьтесь с комментариями ниже.

PHP-скрипт, запущенный через веб-сервер, не будет останавливаться до тех пор, пока:

  • кто-то убил сервер
  • сервер убивает скрипт php

Когда пользователь прервет скрипт, PHP продолжит работу до тех пор, пока не попытается отправить что-то обратно в браузер.

Например, скрипт будет продолжаться до тех пор, даже если пользователь прерывает:

 while(true){ echo 'go'.PHP_EOL; } в while(true){ echo 'go'.PHP_EOL; } 

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

Следующий скрипт остановится, как только пользователь прервет:

 while(true){ echo 'go'.PHP_EOL; flush(); ob_flush(); } в while(true){ echo 'go'.PHP_EOL; flush(); ob_flush(); } 

Этот скрипт остановится, потому что flush () и ob_flush () заставят PHP отправлять свой буфер в браузер, что остановит PHP-скрипт, если пользователь прервал работу. Функция ignore-user-abort () заставит PHP игнорировать прерывание в этом случае.

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

По умолчанию нет. См. Документацию по подключению , особенно:

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

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

См., Что браузер не может «сообщать» серверу, что пользователь больше не просматривает страницу через протокол HTTP. Тем не менее, HTTP-протокол работает поверх TCP-соединения через потоковые сокеты, TCP-соединение поддерживается до тех пор, пока один из концов не хочет прекратить соединение (или определенный тайм-аут достигнут), теперь я действительно не знаю, как браузер обрабатывает это. Браузер мог просто открыть соединение, отправить запрос и закрыть соединение, затем сервер ждет сценарий и отправит ответ на другое соединение. Или браузер может открыть соединение, ПОДКЛЮЧИТЕ это соединение до тех пор, пока сервер не ответит на то же соединение. Если это работает так, то сервер действительно сможет узнать, может ли пользователь больше не просматривать страницу, просто проверяя, жив ли это соединение или был ли он остановлен клиентом. Так что это будет нет.

Не знаю много об этом.

Сценарий будет запускать время, установленное max_execution_time (по умолчанию 30 секунд)

Предупреждение Эта функция не действует, когда PHP работает в безопасном режиме. Обходного пути нет, кроме отключения безопасного режима или изменения временного ограничения в php.ini. Примечание . Функция set_time_limit () и директива конфигурации max_execution_time влияют только на время выполнения самого скрипта. Любое время, затрачиваемое на активность, которое происходит вне выполнения сценария, например системные вызовы с использованием system (), потоковые операции, запросы к базе данных и т. Д., Не включается при определении максимального времени выполнения сценария. Это не относится к Windows, где измеренное время реально. цитата из http://php.net/manual/en/function.set-time-limit.php

вы можете проверить это, выполнив

 <?php unlink('cocorico.txt'); while(true){ file_put_contents('cocorico.txt', microtime(true).PHP_EOL, FILE_APPEND); } в <?php unlink('cocorico.txt'); while(true){ file_put_contents('cocorico.txt', microtime(true).PHP_EOL, FILE_APPEND); } 

и он остановится через 30 секунд (несмотря на то, что вы закроете свой браузер или нет) вы можете получить время исполнения по умолчанию echo ini_get('max_execution_time'); и может быть задано как set_time_limit(3); Ответ, отмеченный как принятый, корректен только для ignore_user_abort но не паникуйте, что ваши сценарии «fail» будут выполняться вечно, если вы не установите max exec time равным 0 – неограниченному;