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

Тема в разделе "PHP", создана пользователем trooll, 10 янв 2012.

Модераторы: latteo
  1. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Можно ли при достижении лимита времени выполнения скрипта (set_time_limit(60) или ini_set("max_execution_time", 60) ), записать в какой либо файл произвольную строку? И вообще возможно выполнение произвольного действия при достижения события set_time_limit или max_execution_time
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    можно, при достижении лимита генерится ошибка. лови её через set_error_handler
     
    trooll нравится это.
  3. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Нарыл тут мануал:
    Перейти по ссылке
    В частности очень заинтересовывал этот кусок:
    Но чего то то ли я не понял чего то, то ли мануал какой то не законченный. Где блин задавать эту завершающую функцию, и как елки палки проверить статус работы скрипта функцией connection_status() если скрипт прекратил свою работу по тайм ауту и уже не работает, чего то какая то фигита или я чего то не так понял.
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    На то он и мануал, чтобы только спецификацию описывать, а не проблемы решать) Хотя сейчас всё нормально описано. По идее должно чтото вроде
    PHP:
    function shutdown() 

    if(
    connection_status()==2){
    echo 
    "TIMEOUT";
    }   
     

    register_shutdown_function('shutdown'); 
     
    trooll нравится это.
  5. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    слушай а что лучше использовать, вариант с обработкой ошибки или же вот этот исполнение функции при достижении события тайм аута?

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

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

    Какой вариант лучше использовать при такой постановки задачи.
     
  6. KillDead

    KillDead

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

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

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

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Парсер пишу, там не разрывных критичных шагов работы нет, если что то не так то можно запросить данные заново (так и работает) страшного не чего не произойдет.

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

    Ладно буду тестить, о результатах отпишусь позже.
     
  8. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    ну, я бы разобрался почему скрипт вылетает. Прогони через хдебаг, либо сделай пхп мониторинг памяти и количества вызова функций... Городить заплатки, типа не работает - перезапустим, неверно наверно))
    Как вариант заплатки- путь лог ведёт твой парсер. Пишет в файл '1' . Поставь на крон проверку изменение этого файла, раз в 10 минут. Если файл не изменился за 10 минут- перезапускай скрипт.
     
  9. trooll

    trooll PHP кодер

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

    Изначально такая реализация и планировалась, но тут видишь скрипт из процессов не вычищаится при зависании и висит там, его надо принудительно вычистить, как вариант это таймаут работы скрипта, как я понял он изначально для таких моментов и задумывался, ну и конечно там для всяких криворукостей в виде бесконечных циклов и рекурсивных функций без механизма остановки:D