Signatur
Beschreibung
pcntl_async_signals() ermöglicht es, POSIX-Signale (wie SIGTERM, SIGUSR1 etc.) asynchron zu verarbeiten, ohne dass ein declare(ticks=1)-Block im Code benötigt wird. Wird true übergeben, werden Signal-Handler, die mit pcntl_signal() registriert wurden, unmittelbar nach dem Eintreffen eines Signals aufgerufen – ohne dass der PHP-Interpreter auf den nächsten Tick warten muss.
Wird die Funktion ohne Argument oder mit null aufgerufen, gibt sie lediglich die aktuelle Einstellung zurück, ohne diese zu ändern. Auf diese Weise lässt sich abfragen, ob asynchrone Signalverarbeitung bereits aktiv ist.
Diese Funktion ist besonders nützlich in lang laufenden Daemon-Prozessen, Job-Queues oder CLI-Skripten, die auf Betriebssystem-Signale reagieren müssen (z. B. für graceful shutdown auf SIGTERM). Im Vergleich zum Ticks-Ansatz ist die asynchrone Variante deutlich performanter, da keine künstlichen Checkpoints im Code eingefügt werden.
Die Funktion steht nur auf Systemen zur Verfügung, auf denen die PCNTL-Erweiterung kompiliert wurde (typischerweise Unix/Linux). Unter Windows ist sie nicht verfügbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $enable | bool|null | null | Wird true übergeben, wird die asynchrone Signalverarbeitung aktiviert; false deaktiviert sie. Wird null übergeben oder kein Argument angegeben, bleibt die aktuelle Einstellung unverändert – die Funktion gibt dann nur den aktuellen Wert zurück. |
Rückgabewert
false. Dient damit auch als Getter für den aktuellen Zustand.Beispiele
Graceful Shutdown eines Daemon-Prozesses mit SIGTERM
<?php
// Asynchrone Signalverarbeitung aktivieren (kein declare(ticks=1) nötig)
pcntl_async_signals(true);
$running = true;
// Signal-Handler für SIGTERM registrieren
pcntl_signal(SIGTERM, function (int $signo) use (&$running): void {
echo "SIGTERM empfangen – Daemon wird sauber beendet." . PHP_EOL;
$running = false;
});
echo "Daemon gestartet (PID: " . getmypid() . ")" . PHP_EOL;
while ($running) {
// Simulierte Arbeit
echo "Arbeite ..." . PHP_EOL;
sleep(2);
}
echo "Daemon beendet." . PHP_EOL;
Aktuellen Status der asynchronen Signalverarbeitung abfragen
<?php
// Aktuellen Zustand abfragen (ohne Änderung)
$aktuell = pcntl_async_signals();
echo "Asynchrone Signale aktiv: " . ($aktuell ? 'ja' : 'nein') . PHP_EOL;
// Aktivieren und vorherigen Zustand merken
$vorher = pcntl_async_signals(true);
echo "Vorheriger Zustand: " . ($vorher ? 'aktiv' : 'inaktiv') . PHP_EOL;
// Erneut abfragen
$jetzt = pcntl_async_signals();
echo "Jetzt aktiv: " . ($jetzt ? 'ja' : 'nein') . PHP_EOL;
// Wichtig · Fallstricke
Plattformabhängigkeit: pcntl_async_signals() ist ausschließlich auf Unix-ähnlichen Betriebssystemen verfügbar. Unter Windows wird die PCNTL-Erweiterung nicht unterstützt.
Kombination mit pcntl_signal_dispatch(): Ohne asynchrone Signalverarbeitung und ohne declare(ticks=1) müssen Signale manuell durch Aufruf von pcntl_signal_dispatch() verarbeitet werden. Mit aktiviertem pcntl_async_signals(true) entfällt dieser manuelle Aufruf.
Reentranz-Probleme: Da Signal-Handler asynchron mitten in der Ausführung von beliebigem Code aufgerufen werden können, ist auf Thread-Sicherheit und Reentranz zu achten. Länger dauernde Operationen oder nicht-atomare Datenzugriffe im Signal-Handler können zu schwer reproduzierbaren Fehlern führen. Signal-Handler sollten daher so kurz wie möglich gehalten werden, z. B. nur ein Flag setzen.