2010-10-13 7 views
3

J'ai trouvé un morceau de code que je ne l'ai pas vu avant:PHP: à quoi sert pcntl_signal?

declare(ticks = 1); 
pcntl_signal(SIGINT, array($this, "catchSignal")); 
pcntl_signal(SIGTERM, array($this, "catchSignal")); 

Je regardais la fonction dans la documentation PHP, mais je ne comprends toujours pas ce que cela est utilisé. S'il vous plaît, aidez-moi à comprendre à quoi cela sert et à quelques exemples où cela devrait être mis en œuvre.

+0

En relation récente: http://stackoverflow.com/questions/3909798/register-php-shutdown-function-to-fire-when-a-script-is-killed-from-the-command-l/3909860# 3909860 –

Répondre

5

L'instruction declare indique de vérifier les événements chaque "tick". Un "tick" étant à peu près égal à une ligne de code. Ceci est utilisé dans les scripts PHP de la ligne de commande afin que vous puissiez intercepter les interruptions et arrêter le script gracieusement au lieu de simplement le tuer.

Le array($this, "catchSignal") dans la fonction pcntl_signal est un travail impair autour (à mon avis) pour soutenir des "objets" en tant que paramètres. Normalement vous feriez simplement $this->catchSignal(), mais PHP n'accepte pas les objets de classe comme paramètres dans ce cas. Ainsi la syntaxe "array".

Fondamentalement, si le script reçoit un signal d'interruption ou de terminaison, appelez la fonction $this->catchSignal() avant de fermer.

+0

Que classifierait-il comme un signal "d'interruption" ou de "terminaison"? – Andrew

+0

Dans ce cas, ce sont des termes Unix. SIGINT est une interruption. Votre programme peut "attraper" et faire quelque chose. Par exemple, "Êtes-vous sûr de vouloir arrêter?". SIGTERM est une commande de fin. Fondamentalement, quittez maintenant. Vous pouvez "l'attraper" et faire le nettoyage avant de quitter. SIGKILL tue juste un programme. http://en.wikipedia.org/wiki/Kill_(command) –

3

Il est utilisé pour installer les gestionnaires signal. Tout ce que je pourrais dire serait juste répéter l'article.

3

La principale chose à comprendre à propos de la gestion des signaux est qu'il s'agit d'un piège dans le système d'exploitation. Ainsi, cela peut arriver en dehors du chemin d'exécution normal de votre code, l'interrompant quand il pourrait faire quelque chose d'autre. Par exemple, si vous contrôlez C dans * nix, il tue généralement tout programme en cours d'exécution. Mais si ce programme fait quelque chose de sensible, il pourrait être une mauvaise idée d'arrêter immédiatement. Ainsi, un programme durable gérera un signal de destruction d'une manière différente; arrêter gracieusement ce qu'il fait avant de terminer son exécution. Pcntl_signal est le moyen de le faire en PHP.