PHP register_shutdown_function срабатывает, когда скрипт уничтожается из командной строки?

Можно ли вызвать функцию при уничтожении процесса cron из командной строки (через Ctrl+c) или с помощью команды kill?

Я пробовал register_shutdown_function(), но, похоже, он не вызывается, когда скрипт уничтожается, но вызывается, когда скрипт завершается нормально.

Я пытаюсь записать результат в файл и обновить значение базы данных, когда экземпляр cron автоматически уничтожается (т.е. работает слишком долго).


person Wei    schedule 11.10.2010    source источник
comment
Что вы подразумеваете под автоматическим уничтожением: системный лимит времени останавливает процесс или PHP останавливает скрипт?   -  person Pekka    schedule 12.10.2010
comment
у меня есть еще один экземпляр cron, который убивает cron, работающие в фоновом режиме, через x секунд.   -  person Wei    schedule 12.10.2010
comment
Может быть, тогда было бы проще войти в скрипт cron, который убивает ...   -  person giraff    schedule 12.10.2010


Ответы (1)


Согласно комментарию в руководстве по register_shutdown_function() , это можно сделать следующим образом:

При использовании CLI (и, возможно, командной строки без CLI - я ее не тестировал) функция выключения не вызывается, если процесс получает SIGINT или SIGTERM. только естественный выход из PHP вызывает функцию выключения. Чтобы решить эту проблему, скомпилируйте интерпретатор командной строки с помощью --enable-pcntl и добавьте этот код:

 <?php
 declare(ticks = 1); // enable signal handling
 function sigint()  { 
    exit;  
 }  
 pcntl_signal(SIGINT, 'sigint');  
 pcntl_signal(SIGTERM, 'sigint');  
 ?>

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

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

person Pekka    schedule 11.10.2010
comment
Это круто, но я не думаю, что смогу перекомпилировать php на рабочей машине. - person Wei; 12.10.2010
comment
@Wei Почему бы вместо этого не полагаться на ограничение времени PHP? (При условии, что это работает в CLI - я никогда не пробовал, и некоторые комментарии здесь предположим, что он жестко запрограммирован на 0 - вам придется попробовать) - person Pekka; 12.10.2010
comment
@Wei также, pcntl может быть уже включен в вашей версии PHP, проверьте это - person Pekka; 12.10.2010
comment
Ограничение по времени будет работать только для одного из параметров убийства. У меня есть и другие параметры, включая использование памяти и использование процессора. - person Wei; 12.10.2010
comment
@ Вей, хорошо, ты прямо упомянул только ограничение по времени ... Не знаю, есть ли другой способ, по крайней мере, не использовать kill - person Pekka; 12.10.2010
comment
обратите внимание, что начиная с PHP 4.3 (которую все должны хотя бы использовать), вам нужно начать этот пример кода ответа с declare(ticks = 1);, чтобы pcntl_signal работало. документы: php.net/pcntl_signal - person georgiecasey; 23.04.2015
comment
@georgiecasey: я подозреваю, что в вашем комментарии выше вы имели в виду 5.3! - person halfer; 03.04.2017