Richtet eine Signalverarbeitung ein

# pcntl_signal

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

pcntl_signal — Richtet eine Signalverarbeitung ein

### Beschreibung

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

Die Funktion pcntl_signal() richtet eine neue Signalverarbeitung für das in `signal` angegebene Signal ein oder ersetzt die aktuelle.

### Parameter-Liste

`signal`

  Die Signalnummer.

`handler`

  Die Signalverarbeitung. Dies ist entweder ein callable, das aufgerufen wird, um das Signal zu verarbeiten, oder eine der beiden globalen Konstanten `SIG_IGN` oder `SIG_DFL`, die das Signal ignorieren bzw. die Standard-Signalverarbeitung wiederherstellen.

  Wird ein callable übergeben, muss es folgende Signatur haben:

  function handler(int `$signo`, mixed `$siginfo`): void
  `signal`
    Das zu verarbeitende Signal.
  `siginfo`
    Wenn das Betriebssystem siginfo_t-Strukturen unterstützt, ist dies ein Array von Signalinformationen, die vom Signal abhängen.

  > Hinweis:

  > Es ist zu beachten, dass die Verwendung einer Objektmethode als Signalverarbeitung den Referenzzähler des Objekts erhöht, weshalb das Objekt bestehen bleibt, bis entweder die Verarbeitung geändert wird oder das Skript endet.

`restart_syscalls`

  Gibt an, ob der Neustart von Systemaufrufen verwendet werden soll, wenn das Signal eintrifft.

### Rückgabewerte

Gibt bei Erfolg `true` zurück. Bei einem Fehler wird `false` zurückgegeben.

### Changelog

Version | Beschreibung
--- | ---
7.1.0 | Von PHP 7.1.0 an wird der Signalverbeitung ein zweites Argument übergeben, das die siginfo des spezfischen Signals enthält. Diese Daten werden nur zur Verfügung gestellt, wenn das System die siginfo_t-Struktur kennt. Wenn das Betriebssystem siginfo_t nicht implementiert, wird `null` übergeben.

### Beispiele

Beispiel #1 pcntl_signal()-Beispiel

    <?php
    pcntl_async_signals(true);

    // Signalverarbeitungsfunktion
    function sig_handler($signo)
    {

         switch ($signo) {
             case SIGTERM:
                 // Aufgaben zum Beenden bearbeiten
                 exit;
                 break;
             case SIGHUP:
                 // Aufgaben zum Neustart bearbeiten
                 break;
             case SIGUSR1:
                 echo "SIGUSR1 abgefangen...\n";
                 break;
             default:
                 // Alle anderen Signale verarbeiten
         }

    }

    echo "Richte Signalverarbeitung ein...\n";

    // Signalverarbeitung einrichten
    pcntl_signal(SIGTERM, "sig_handler");
    pcntl_signal(SIGHUP,  "sig_handler");
    pcntl_signal(SIGUSR1, "sig_handler");

    // oder ein Objekt verwenden
    // pcntl_signal(SIGUSR1, array($obj, "do_something"));

    echo "Erzeuge signal SIGTERM an mich selbst...\n";

    // sende SIGUSR1 an die aktuelle Prozess-ID
    // Für posix_*-Funktionen wird die Posix-Erweiterung benötigt
    posix_kill(posix_getpid(), SIGUSR1);

    echo "Fertig\n"

    ?>

### Anmerkungen

pcntl_signal() stapelt die Signalverarbeitungen nicht, sondern ersetzt sie.

#### Methoden zur Signalzustellung

Es gibt mehrere Methoden zur Zustellung von Signalhandlern:

- Asynchrone Zustellung mit aktivierten pcntl_async_signals(). Dies ist die empfohlene Methode
- Festlegen der Tick-Frequenz
- Manuelle Zustellung mit pcntl_signal_dispatch()

Wenn Signale asynchron oder auf tickbasierte Ausführung zugestellt werden, können blockierende Funktionen wie sleep() unterbrochen werden.

### Siehe auch

- » Signal (IPC) auf Wikipedia
- pcntl_async_signals() - Aktiviert oder deaktiviert die asynchrone Signalverarbeitung oder gibt die vorherige Einstellung zurück
- pcntl_fork() - Verzweigt den laufenden Prozess
- pcntl_signal_dispatch() - Ruft die Signal-Handler für ausstehende Signale auf
- pcntl_waitpid() - Wartet auf ein abgezweigtes Kind oder gibt dessen Status zurück

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