Installe un gestionnaire de signaux

# 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

pcntl_signal() installe un nouveau gestionnaire de signaux ou remplace le gestionnaire de signaux courant pour le signal indiqué par le paramètre `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
  `signal`
    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:

  > À noter que lorsque l'on configure le gestionnaire avec une méthode d'objet, le compteur de référence de l'objet est incrémenté, ce qui le rend persistant jusqu'à ce que l'on change le gestionnaire de signaux pour un autre, ou que le script se termine.

`restart_syscalls`

  Le paramètre optionnel `restart_syscalls` spécifie si l'appel système de redémarrage (restarting) doit être utilisé lorsque ce signal arrive.

### Valeurs de retour

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

### Historique

Version | Description
--- | ---
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 :

- Dispatch asynchrone avec pcntl_async_signals() activé. Ceci est la méthode recommandée
- Définir la fréquence des ticks
- Dispatch manuel avec pcntl_signal_dispatch()

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

- » Signal (IPC) sur Wikipedia
- pcntl_async_signals() - Active/désactive la gestion asynchrone des signaux ou retourne l'ancien paramètre
- pcntl_fork() - Duplique le processus courant
- pcntl_signal_dispatch() - Appelle les gestionnaires de signaux pour chaque signal en attente
- pcntl_waitpid() - Attend la fin de l'exécution d'un processus fils

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open