2010-10-11 3 views
10

Est-il possible d'invoquer une fonction quand un processus cron est tué à partir de la ligne de commande (via Ctrl + c) ou avec la commande kill?La fonction register_shutdown_function de PHP se déclenche quand un script est tué à partir de la ligne de commande?

J'ai essayé register_shutdown_function(), mais il ne semble pas être invoqué lorsque le script est tué, mais il est invoqué lorsque le script se termine normalement. J'essaye de consigner le résultat dans un fichier et mettre à jour une valeur de base de données quand une instance de cron est tuée automatiquement (c'est-à-dire a fonctionné trop longtemps).

+0

Que voulez-vous dire par "tué automatiquement": La limite de temps du système qui arrête le processus, ou l'arrêt du script par PHP? –

+0

J'ai une autre instance cron qui tue les crons qui ont fonctionné en arrière-plan après x secondes. – Wei

+0

Peut-être qu'il serait plus simple de se connecter au script cron qui tue ... – giraff

Répondre

14

Selon un comment in the manual on register_shutdown_function(), cela peut se faire de la manière suivante:

Lorsque vous utilisez CLI (peut-être et de commandement ligne sans CLI - Je ne l'ai pas le tester) la fonction d'arrêt ne soit pas appelé si le processus obtient un SIGINT ou SIGTERM. seule la sortie naturelle de PHP appelle la fonction shutdown. Pour surmonter le problème de compiler l'interpréteur de ligne de commande avec --enable-pcntl et ajoutez ce code:

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

De cette façon, lorsque le processus reçoit un de ces signaux, il quitte normaly, et la fonction d'arrêt est appelée. ... (en abrégé pour économiser de l'espace, lisez le texte intégral)

Si cela est trop de tracas, je envisagerais de faire la temporisation à partir de PHP en définissant une limite de temps à la place. Atteindre la limite lancera une erreur fatale, et la fonction d'arrêt devrait être appelée normalement.

+0

C'est cool, mais je ne pense pas que je serai capable de recompiler php sur une machine de production. – Wei

+0

@Wei Pourquoi ne pas compter sur la limite de temps de PHP à la place? (À condition que cela fonctionne sur CLI - Je n'ai jamais essayé, et quelques commentaires [ici] (http://de.php.net/manual/en/function.set-time-limit.php) suggèrent qu'il est codé en dur à 0 - vous devriez essayer) –

+0

@Wei aussi, 'pcntl' peut déjà être activé dans votre version de PHP, vérifiez-le –