Start · Sprachen · PHP · Referenz · pcntl_signal_get_handler

pcntl_signal_get_handler

Funktion

Gibt den aktuell registrierten Handler (Callback, Konstante oder SIG_DFL/SIG_IGN) für ein bestimmtes POSIX-Signal zurück.

seit PHP 7.1.0 Kategorie: misc

Signatur

pcntl_signal_get_handler(int $signal): Closure|string|int

Beschreibung

pcntl_signal_get_handler() liefert den Handler, der mit pcntl_signal() für das angegebene Signal registriert wurde. Dies ist nützlich, wenn man den aktuellen Signalhandler inspizieren, temporär ersetzen und später wiederherstellen möchte – ein typisches Muster bei Libraries, die Signale verwalten, ohne die Host-Anwendung zu stören.

Der Rückgabewert kann ein Closure- oder callable-Objekt sein (wenn ein PHP-Callback registriert wurde), der String 'SIG_DFL' oder 'SIG_IGN' (wenn der Standard- bzw. Ignore-Handler aktiv ist), oder die Integer-Konstanten SIG_DFL (0) bzw. SIG_IGN (1), sofern noch kein PHP-Handler gesetzt wurde.

Die Funktion ist Teil der pcntl-Erweiterung und steht daher nur auf POSIX-kompatiblen Betriebssystemen (Linux, macOS etc.) zur Verfügung. Unter Windows ist sie nicht verfügbar.

Typischer Einsatz: Vor dem Registrieren eines eigenen Handlers den alten sichern, um ihn am Ende wieder herzustellen – etwa bei Daemon-Prozessen, Testsystemen oder Frameworks, die Signalbehandlung kapseln.

Parameter

Name Typ Default Beschreibung
$signal Pflicht int Die Signalnummer, deren Handler abgerufen werden soll. Verwende die vordefinierten Konstanten wie SIGTERM, SIGINT, SIGUSR1 etc.

Rückgabewert

Typ
Closure|string|int
Beschreibung

Gibt einen der folgenden Werte zurück:

  • Ein Closure- oder sonstiges Callable-Objekt, wenn ein PHP-Handler via pcntl_signal() registriert wurde.
  • Den String 'SIG_DFL', wenn der System-Standardhandler nach vorherigem Setzen wiederhergestellt wurde.
  • Den String 'SIG_IGN', wenn das Signal ignoriert wird.
  • Die Integer-Konstante SIG_DFL (0), wenn für das Signal noch nie ein PHP-Handler gesetzt wurde.

Beispiele

Aktuellen SIGTERM-Handler abrufen

<?php
// Zunächst keinen Handler gesetzt — Standard wird zurückgegeben
$handler = pcntl_signal_get_handler(SIGTERM);
var_dump($handler); // int(0) = SIG_DFL

// Eigenen Handler registrieren
pcntl_signal(SIGTERM, function (int $signo) {
    echo "SIGTERM empfangen ($signo)\n";
});

$handler = pcntl_signal_get_handler(SIGTERM);
var_dump($handler); // object(Closure)
int(0) object(Closure)#1 (0) { }

Handler sichern, überschreiben und wiederherstellen

<?php
// Alten Handler sichern
$oldHandler = pcntl_signal_get_handler(SIGUSR1);

// Temporären Handler setzen
pcntl_signal(SIGUSR1, function (int $signo) {
    echo "Temporärer Handler für SIGUSR1\n";
});

// ... eigene Verarbeitung ...

// Alten Handler wiederherstellen
if ($oldHandler === SIG_DFL || $oldHandler === 0) {
    pcntl_signal(SIGUSR1, SIG_DFL);
} elseif ($oldHandler === SIG_IGN || $oldHandler === 1) {
    pcntl_signal(SIGUSR1, SIG_IGN);
} else {
    pcntl_signal(SIGUSR1, $oldHandler);
}

echo "Ursprünglicher Handler wiederhergestellt.\n";
Ursprünglicher Handler wiederhergestellt.

// Wichtig · Fallstricke

Plattform: Die Funktion ist nur auf POSIX-Systemen verfügbar (Linux, macOS). Unter Windows steht die gesamte pcntl-Erweiterung nicht zur Verfügung.

Async-Signal-Handling: Damit registrierte PHP-Callbacks tatsächlich ausgeführt werden, müssen entweder pcntl_async_signals(true) aktiviert sein oder pcntl_signal_dispatch() regelmäßig aufgerufen werden. pcntl_signal_get_handler() selbst führt keine Dispatching-Logik aus.

Rückgabewert-Prüfung: Da sowohl Integer-Werte (0, 1) als auch Strings ('SIG_DFL', 'SIG_IGN') möglich sind, empfiehlt sich ein strikter Vergleich mit === gegen die Konstanten SIG_DFL und SIG_IGN, um Typ-Verwirrungen zu vermeiden.