Signatur
Beschreibung
pcntl_wifexited() wertet den Statuscode aus, der von pcntl_wait() oder pcntl_waitpid() zurückgegeben wurde, und gibt true zurück, wenn der Kindprozess auf normalem Weg – also durch einen Aufruf von exit(), _exit() oder durch Rückkehr aus der Hauptfunktion – beendet wurde. Wurde der Prozess hingegen durch ein Signal abgebrochen, liefert die Funktion false.
Diese Funktion ist die PHP-Entsprechung des POSIX-Makros WIFEXITED() und gehört zur PCNTL-Erweiterung, die für Unix-basierte Mehrprozess-Anwendungen benötigt wird. Sie erlaubt es, zwischen einer normalen Terminierung und einem signalinduzierten oder abgebrochenen Ende zu unterscheiden, bevor mit pcntl_wexitstatus() der eigentliche Exit-Code abgerufen wird.
Typisches Anwendungsmuster: Nach pcntl_waitpid() zunächst pcntl_wifexited() prüfen, um sicherzugehen, dass der Exit-Code aussagekräftig ist, und danach mit pcntl_wexitstatus() den konkreten Rückgabewert des Kindprozesses auslesen. Ohne diese Prüfung könnte ein ungültiger Exit-Code fälschlicherweise als Erfolg oder Fehler interpretiert werden.
Die Funktion steht nur auf Systemen zur Verfügung, auf denen die PCNTL-Erweiterung verfügbar und aktiviert ist (typischerweise Linux und macOS; nicht unter Windows).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $status Pflicht | int | Der Statuscode, den pcntl_wait() oder pcntl_waitpid() per Referenz-Parameter zurückgeliefert hat. Dieser rohe Wert enthält kodierte Informationen über den Beendigungsgrund des Kindprozesses. |
Rückgabewert
true zurück, wenn der Kindprozess normal beendet wurde (d. h. durch exit() oder Rückkehr aus main()), andernfalls false (z. B. bei Beendigung durch ein Signal).Beispiele
Normales Beenden eines Kindprozesses erkennen
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: normaler Abschluss mit Exit-Code 42
exit(42);
} else {
// Elternprozess: auf Kindprozess warten
$status = 0;
pcntl_waitpid($pid, $status);
if (pcntl_wifexited($status)) {
$exitCode = pcntl_wexitstatus($status);
echo "Kindprozess normal beendet mit Exit-Code: {$exitCode}\n";
} else {
echo "Kindprozess wurde NICHT normal beendet.\n";
}
}
Unterscheidung zwischen normalem Ende und Signal-Abbruch
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: sich selbst mit SIGTERM beenden
posix_kill(posix_getpid(), SIGTERM);
sleep(10); // wird nicht erreicht
exit(0);
} else {
$status = 0;
pcntl_waitpid($pid, $status);
if (pcntl_wifexited($status)) {
echo "Normales Ende, Exit-Code: " . pcntl_wexitstatus($status) . "\n";
} elseif (pcntl_wifsignaled($status)) {
echo "Durch Signal beendet: " . pcntl_wtermsig($status) . "\n";
} else {
echo "Unbekannter Beendigungsgrund.\n";
}
}
// Wichtig · Fallstricke
Plattformabhängigkeit: pcntl_wifexited() ist nur auf Unix-ähnlichen Betriebssystemen verfügbar (Linux, macOS u. ä.). Unter Windows steht die gesamte PCNTL-Erweiterung nicht zur Verfügung.
Reihenfolge der Prüfungen: Rufen Sie pcntl_wexitstatus() nur dann auf, wenn pcntl_wifexited() zuvor true ergeben hat – andernfalls ist der Exit-Code nicht definiert und das Ergebnis bedeutungslos.
Zombie-Prozesse: Ohne pcntl_wait() / pcntl_waitpid() werden beendete Kindprozesse zu Zombie-Prozessen. Stellen Sie sicher, dass der Elternprozess stets auf alle Kinder wartet.