Могут ли скрипты PHP продолжать работать, даже если пользователь закрыл браузер?

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

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

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

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

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

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

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

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

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. Из-за max_execution_time PHP скрипт истекает и умирает.

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

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

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

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

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

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

EDIT: Кстати, вы уверены, что хотите, чтобы страницы открывали 10 минут? Я предлагаю вам использовать очередь задач (чьи элементы выполняются cron на своевременной основе) и перенаправить пользователя на страницу «ok, I'm on it».