2010-01-21 4 views
5

Я пытаюсь отследить, что кажется очень странной ошибкой. У меня есть приложение, которое структурировано примерно следующим образом:Может ли PHP-скрипт завершаться, даже если установлен set_time_limit (0)?

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.

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

ответ

9

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

+0

Интересно. У меня не было этого набора, но скрипт продолжал выполнение после нажатия кнопки остановки независимо. Это может быть связано с тем, как выполняется буферизация ... Спасибо за предложение, я проверю это. –

4

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

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

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

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

+0

+1, я думаю, что это отличный информативный ответ. –

+0

Хороший вопрос о регистрации. Что касается работы через CLI, это то, что я обязательно сделаю в какой-то момент, но, к сожалению, для этого требуется существенный рефакторинг кода в нашем приложении. Что касается перезагрузки HTTP ... Интересно, делает ли «httpd graceful» все еще прекращение работы PHP-скриптов. –

Смежные вопросы