Могут ли скрипты 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, я на ней".