Signatur
Beschreibung
pcntl_wifsignaled() analysiert den Statuscode, der von pcntl_wait() oder pcntl_waitpid() zurückgeliefert wurde, und gibt true zurück, wenn der Kindprozess durch ein Signal beendet wurde, das er nicht selbst abgefangen hat (z. B. SIGKILL, SIGSEGV).
Diese Funktion ist essenziell für die Prozessüberwachung in Multiprocessing-Anwendungen. Wenn ein Kindprozess durch ein Signal abgebrochen wurde, sollte der Elternprozess reagieren – beispielsweise durch Protokollierung, Neustart des Kindprozesses oder Weiterleitung des Fehlers.
Um herauszufinden, welches Signal den Abbruch verursacht hat, kann ergänzend pcntl_wtermsig() verwendet werden. Dieses liefert die Signalnummer, die den Prozess beendet hat.
Wichtig: Die Funktion ist nur auf Unix-ähnlichen Systemen verfügbar und erfordert die PHP-Erweiterung pcntl, die standardmäßig nicht in allen PHP-Builds enthalten ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $status Pflicht | int | Der Statuscode, der als Referenzparameter von pcntl_wait() oder pcntl_waitpid() befüllt wurde. Dieser Rohwert darf nicht manuell gesetzt werden. |
Rückgabewert
true zurück, wenn der Kindprozess durch ein nicht abgefangenes Signal beendet wurde, andernfalls false.Beispiele
Kindprozess starten und auf Signal-Abbruch prüfen
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: simuliert einen Absturz durch SIGSEGV
posix_kill(posix_getpid(), SIGSEGV);
exit(0);
} else {
// Elternprozess wartet auf das Kind
$pid = pcntl_wait($status);
if (pcntl_wifsignaled($status)) {
$signal = pcntl_wtermsig($status);
echo "Kindprozess wurde durch Signal {$signal} beendet.\n";
} else {
echo "Kindprozess normal beendet.\n";
}
}
Mehrere Kindprozesse überwachen und Signal-Abbrüche protokollieren
<?php
$children = [];
for ($i = 0; $i < 3; $i++) {
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: erstes Kind wird durch Signal beendet
if ($i === 0) {
posix_kill(posix_getpid(), SIGTERM);
}
sleep(1);
exit(0);
} else {
$children[] = $pid;
}
}
foreach ($children as $childPid) {
pcntl_waitpid($childPid, $status);
if (pcntl_wifsignaled($status)) {
$sig = pcntl_wtermsig($status);
echo "PID {$childPid}: durch Signal {$sig} abgebrochen.\n";
} else {
$code = pcntl_wexitstatus($status);
echo "PID {$childPid}: normal beendet mit Exit-Code {$code}.\n";
}
}
// Wichtig · Fallstricke
Plattformabhängigkeit: pcntl_wifsignaled() steht nur auf Unix-artigen Betriebssystemen zur Verfügung (Linux, macOS etc.). Unter Windows ist die pcntl-Erweiterung nicht verfügbar.
Achtung: Der $status-Parameter muss direkt von pcntl_wait() oder pcntl_waitpid() stammen. Ein selbst gesetzter oder berechneter Wert liefert unzuverlässige Ergebnisse, da es sich um einen systeminternen Bitfeld-Wert handelt.
Um den vollständigen Prozess-Lebenszyklus korrekt zu prüfen, sollte man pcntl_wifexited(), pcntl_wifsignaled() und pcntl_wifstopped() kombinieren, um alle möglichen Endzustände abzudecken.