pcntl_signal
PHP Manual
PHP Manual»Fonctions PCNTL»pcntl_signal

pcntl_signal

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_signal — Installe un gestionnaire de signaux

Description

function pcntl_signal(int $signal, callable|int $handler, bool $restart_syscalls = true): bool

La fonction pcntl_signal() installe un nouveau gestionnaire de signaux ou remplace le gestionnaire de signaux courant pour le signal indiqué par signal.

Liste de paramètres

signal

Le numéro du signal.

handler

Le gestionnaire de signaux. Peut être un callable, qui sera appelé pour gérer le signal, ou bien l'une des deux constantes globales SIG_IGN ou SIG_DFL, qui vont, respectivement, ignorer le signal ou restaurer le gestionnaire de signaux par défaut.

Si un callable est fourni, il doit implémenter la signature suivante :

function handler(int $signo, mixed $siginfo): void
signo

Le signal à gérer.

siginfo

Si le système d'exploitation supporte les structures siginfo_t, ceci sera un tableau d'informations du signal qui dépendent du signal.

Note:

Lorsque le gestionnaire est défini avec une méthode d'objet, le compteur de références de cet objet est incrémenté, ce qui le rend persistant jusqu'à ce que le gestionnaire soit remplacé par un autre, ou que le script se termine.

restart_syscalls

Spécifie si le redémarrage des appels système doit être utilisé lorsque ce signal arrive.

Note:

Bien que la valeur par défaut de ce paramètre soit true, cette valeur par défaut ne s'applique pas à SIGALRM : lorsque restart_syscalls n'est pas fourni et que signal vaut SIGALRM, le redémarrage des appels système est désactivé. Il faut fournir true explicitement pour activer le redémarrage des appels système pour SIGALRM.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

Une ValueError est levée si signal est inférieur à 1 ou supérieur ou égal à NSIG, ou si handler est un int autre que SIG_DFL ou SIG_IGN.

Une TypeError est levée si handler n'est ni un callable ni un int.

Historique

Version Description
7.4.0 restart_syscalls est désormais pris en compte pour SIGALRM ; antérieurement, le redémarrage des appels système était toujours désactivé pour ce signal. Lorsque l'argument n'est pas fourni, le redémarrage des appels système reste désactivé pour SIGALRM.
7.1.0 À partir de PHP 7.1.0, le gestionnaire de signaux reçoit un second argument contenant le siginfo du signal spécifique. Ces données ne sont fournies que si le système d'exploitation dispose de la structure siginfo_t. Si le système d'exploitation n'implémente pas siginfo_t, null est fourni.

Exemples

Exemple #1 Exemple avec pcntl_signal()

<?php
pcntl_async_signals(true);

// gestionnaire de signaux système
function sig_handler($signo)
{

     switch ($signo) {
         case SIGTERM:
             // gestion de l'extinction
             exit;
             break;
         case SIGHUP:
             // gestion du redémarrage
             break;
         case SIGUSR1:
             echo "Reçu le signal SIGUSR1...\n";
             break;
         default:
             // gestion des autres signaux
     }

}

echo "Installation du gestionnaire de signaux...\n";

// Installation des gestionnaires de signaux
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

// ou bien utiliser un objet
// pcntl_signal(SIGUSR1, array($obj, "faire_quelque_chose"));

echo"Génération d'un signal SIGUSR1 à moi-même...\n";

// envoi de SIGUSR1 à l'identifiant de processus courant
// les fonctions posix_* nécessitent l'extension posix
posix_kill(posix_getpid(), SIGUSR1);

echo "Fait\n";

?>

Notes

La fonction pcntl_signal() ne place pas dans une pile les gestionnaires de signaux, mais les remplace.

Méthode de dispatch

Il existe plusieurs méthodes pour dispatcher les gestionnaires de signaux :

Lorsque les signaux sont dispatchés de manière asynchrone ou utilisant une exécution basée sur les ticks, les fonctions bloquantes comme sleep() peuvent être interrompues.

Voir aussi

To Top