Выполнение произвольного действия при достижения события set_time_limit или max_execution_time

trooll

PHP кодер
Регистрация
22 Дек 2008
Сообщения
482
Реакции
117
Можно ли при достижении лимита времени выполнения скрипта (set_time_limit(60) или ini_set("max_execution_time", 60) ), записать в какой либо файл произвольную строку? И вообще возможно выполнение произвольного действия при достижения события set_time_limit или max_execution_time
 
можно, при достижении лимита генерится ошибка. лови её через set_error_handler
 
Нарыл тут мануал:

В частности очень заинтересовывал этот кусок:
Выполнение вашего скрипта также может быть прервано встроенным таймером. Стандартное ограничение по времени составляет 30 секунд, изменить его можно при помощи директивы max_execution_time в конфигурационном файле php.ini. Такого же результата можно достичь, добавив php_value max_execution_time в конфигурационный файл Apache httpd.conf или воспользовавщись функцией set_time_limit(). При достижении скриптом временного лимита выполнение скрипта прерывается и вызывается завершающая функция, если она была указана. Уточнить причину завершения скрипта вы можете при помощи функции connection_status(), которая возвращает 2, если скрипт был прерван по достижению временного ограничения.

Но чего то то ли я не понял чего то, то ли мануал какой то не законченный. Где блин задавать эту завершающую функцию, и как елки палки проверить статус работы скрипта функцией connection_status() если скрипт прекратил свою работу по тайм ауту и уже не работает, чего то какая то фигита или я чего то не так понял.
 
На то он и мануал, чтобы только спецификацию описывать, а не проблемы решать) Хотя сейчас всё нормально описано. По идее должно чтото вроде
PHP:
function shutdown() 
{ 
if(connection_status()==2){
echo "TIMEOUT";
}   
 
} 
register_shutdown_function('shutdown');
 
слушай а что лучше использовать, вариант с обработкой ошибки или же вот этот исполнение функции при достижении события тайм аута?

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

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

Какой вариант лучше использовать при такой постановки задачи.
 
Первый вариант с обработкой ошибки- мне просто первым пришёл в голову. Лучше и чище- второй вариант (если он заработает , я его не проверял).
Что до прерывания по лимиту времени- он остановит скрипт в любом месте. Это опасно если есть неразрывно связанные шаги, скажем есть регер:

1. Берём из файла логин и регистрируем его
2. Добавляем побочную инфу
3. Сохраняем в базу результат

Если скрипт прервётся на втором шаге, то мы получим что логин зареган нами, а добавить его не удалось и больше не удастся- так как он зареган уже. Нехорошо.
Если такая проблема есть - Я бы советовал сделать таймер на пхп и проверять его в начале либо в конце повторяющихся действий (перед 1 шагом либо после 3)
 
Парсер пишу, там не разрывных критичных шагов работы нет, если что то не так то можно запросить данные заново (так и работает) страшного не чего не произойдет.

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

Ладно буду тестить, о результатах отпишусь позже.
 
ну, я бы разобрался почему скрипт вылетает. Прогони через хдебаг, либо сделай пхп мониторинг памяти и количества вызова функций... Городить заплатки, типа не работает - перезапустим, неверно наверно))
Как вариант заплатки- путь лог ведёт твой парсер. Пишет в файл '1' . Поставь на крон проверку изменение этого файла, раз в 10 минут. Если файл не изменился за 10 минут- перезапускай скрипт.
 
ну, я бы разобрался почему скрипт вылетает. Прогони через хдебаг, либо сделай пхп мониторинг памяти и количества вызова функций... Городить заплатки, типа не работает - перезапустим, неверно наверно))

Ну ты же знаешь что такое сроки;) и этапы сдачи работы, сейчас пока нет времени делать разбор полетов, пока что вижу такое решение в виде жесткого костыля. Тем более по последним тестам, скрипт 12000 товаров предлагал парсить 16 часов, что сам понимаешь очень много и жесткое обнуление думаю будет ему даже в пользу.
Что касаемо дебага, у нас запланирован период разработки на дебагинг так что там можно будет как раз заняться этим вопросом.

Как вариант заплатки- путь лог ведёт твой парсер. Пишет в файл '1' . Поставь на крон проверку изменение этого файла, раз в 10 минут. Если файл не изменился за 10 минут- перезапускай скрипт.
Изначально такая реализация и планировалась, но тут видишь скрипт из процессов не вычищаится при зависании и висит там, его надо принудительно вычистить, как вариант это таймаут работы скрипта, как я понял он изначально для таких моментов и задумывался, ну и конечно там для всяких криворукостей в виде бесконечных циклов и рекурсивных функций без механизма остановки:D
 
Назад
Сверху