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

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

+24
источник поделиться
5 ответов

Смотрите здесь: http://php.net/manual/en/function.ignore-user-abort.php

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

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

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

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

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

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

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

+16
источник

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

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

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

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

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

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

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

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

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

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

+13
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

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

+4
источник

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

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

Не так много об этом.

+1
источник

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

Предупреждение Эта функция не действует, когда PHP работает в безопасном режиме. Обходного пути нет, кроме отключения безопасного режима или изменения срок в php.ini. Примечание: функция set_time_limit() и директива конфигурации max_execution_time влияет только на время выполнения самого script. Любое время, потраченное на происходит вне выполнения script, например, системных вызовов, используя system(), операции потока, запросы к базе данных и т.д. не включены при определении максимального времени работы script. Это не относится к 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); 
} 

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос