Могут ли скрипты PHP продолжать работать, даже если пользователь закрыл браузер?
Например, существует очень простой PHP script, который обновляет некоторые таблицы в базе данных, но этот процесс занимает много времени (может быть, 10 минут). Поэтому я хочу, чтобы этот script продолжал обработку, даже если пользователь закрыл браузер, потому что иногда пользователи не ждут, и они закрывают браузер или переходят на другую веб-страницу.
Ответы
Ответ 1
Чтобы ответить на ваш вопрос напрямую, см. ignore_user_abort
В более широком смысле, у вас, вероятно, есть проблема с архитектурой.
Если многие пользователи могут инициировать этот материал, вам нужно, чтобы веб-приложение добавляло задания в какую-то очередь и имело заданное количество фоновых процессов, которые пережевывали всю работу.
Ответ 2
Если задача занимает 10 минут, не используйте браузер для ее выполнения. У вас есть много других возможностей:
- Используйте cronjob для выполнения задачи
периодически.
- У браузера
запрос вставить новую строку в
таблицы базы данных, чтобы
cronjob может обрабатывать новую строку и
выполните PHP скрипт с помощью
соответствующие аргументы
-
запрос браузера написать сообщение
система очереди, у которой есть абонент
слушая такие события (которые затем
выполняет script).
Хотя некоторые из этих предложений, вероятно, слишком сложны для вашей ситуации, ключ, объединяющий функцию, заключается в том, чтобы отменить запрос браузера от выполнения задания, чтобы он мог выполняться асинхронно.
Если вам нужно, чтобы окно браузера обновлялось с прогрессом, вам нужно будет использовать периодически выполненный запрос AJAX для получения статуса задания.
Ответ 3
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. Из-за PHP max_execution_time
время script истекает и умирает.
Ответ 4
если script полностью сервер (без обратной связи с пользователем), это будет сделано, даже если клиент закрыт.
Общая архитектура PHP заключается в том, что клиенты отправляют запрос на script, который дает ответ пользователю. если ничто не возвращается пользователю, script будет выполняться, даже если пользователь больше не находится на другой стороне. Более просто: их нет постоянной связи между сервером и клиентом на регулярной script.
Ответ 5
Вы можете запустить PHP script каждые 20 минут, используя файл crontab, который содержит время и какую команду запускать в этом случае, это будет PHP скрипт.
Ответ 6
Да. Сервер не знает, закрыл ли пользователь браузер. По крайней мере, это не замечает этого сразу.
Нет: сервер, вероятно (в зависимости от того, как он настроен) не позволит запускать php script в течение 10 минут. На дешевом общедоступном хостинге я бы не полагался на script, работающий дольше, чем разумное время отклика.
Ответ 7
Серверная сторона script будет продолжать то, что она делает, независимо от того, что делает клиент.
EDIT: Кстати, вы уверены, что хотите, чтобы страницы открывали 10 минут? Я предлагаю вам использовать очередь задач (чьи элементы выполняются cron на своевременной основе) и перенаправить пользователя на страницу "ok, я на ней".