Может ли скрипт PHP завершиться, даже если установлен set_time_limit (0)? - PullRequest
5 голосов
/ 21 января 2010

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

set_time_limit(0);
register_shutdown_function('logScriptCompletion');

function logScriptCompletion() {
   log('script completed');
}

log('script started');

// do some calculations periodically printing out progress

Выполнение сценария может занять некоторое время. Требуемое поведение для сценария - продолжать вычисление до конца, даже если нажата кнопка остановки или соединение разорвано. 99% времени он работает как положено.

Время от времени (возможно, раз в несколько месяцев / пару тысяч запросов) вычисления не выполняются полностью, но регистрируются как «сценарий запущен», так и «сценарий завершен», и никакой другой ошибки не существует (У меня включена полная регистрация).

У меня есть подозрение, что это может быть связано с разрывом соединения с сервером, но нет веских доказательств для подтверждения. Я использую Apache 2 / PHP 5.2.6 в Linux.

Кто-нибудь еще видел подобную проблему и может помочь пролить свет на это?

Ответы [ 2 ]

9 голосов
/ 21 января 2010

Абсолютно! Вы также должны использовать функцию ignore_user_abort() , чтобы убедиться.

4 голосов
/ 21 января 2010

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

Таким образом, вы будете использовать веб-сайт для регистрации того факта, что вам нужно запустить задание фоновой обработки (например, в таблице базы данных) и загрузить любые данные, которые нужно обработать. Выполненный cron PHP-скрипт затем проверит наличие любых отложенных заданий в базе данных, пометит задание как незавершенное после его запуска, а затем обновит поле «процент выполнения» в таблице базы данных, которое веб-сайт может прочитать - следовательно информирование пользователя о прогрессе.

Когда обработка будет завершена, PHP соответствующим образом обновит базу данных, пометив задание как обработанное и при необходимости отправив электронное письмо пользователю и т. Д.

Примечание: Вы можете с пользой расширить этот подход, добавив некоторые базовые поля даты и времени для начала и окончания обработки, что позволяет легко проверять наличие заданий, выполнявшихся в течение длительного периода времени, и т. Д. .

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