Signatur
Beschreibung
pcntl_wexitstatus() extrahiert den numerischen Exit-Code, mit dem ein Kindprozess beendet wurde, aus dem rohen Statuswert, den pcntl_wait() oder pcntl_waitpid() über ihren Referenz-Parameter zurückliefern. Der rohe Statuswert kodiert verschiedene Informationen (Exit-Code, Signal, Core-Dump) bitweise – diese Funktion dekodiert genau den Exit-Code-Anteil daraus.
Die Funktion ist nur sinnvoll, wenn der Kindprozess tatsächlich durch einen normalen Aufruf von exit() oder durch Rückkehr aus main() beendet wurde. Um das sicherzustellen, sollte zuvor pcntl_wifexited() aufgerufen werden, das prüft, ob der Prozess normal (und nicht durch ein Signal) beendet wurde.
Typische Anwendungsfälle sind Multiprocessing-Architekturen, bei denen ein Elternprozess mehrere Kindprozesse startet und deren Erfolg oder Misserfolg anhand des Exit-Codes auswertet – etwa bei Batch-Verarbeitung, Daemon-Prozessen oder parallelen Worker-Modellen.
Hinweis: Die Funktion ist nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) verfügbar und steht unter Windows nicht zur Verfügung. Die pcntl-Erweiterung muss beim Kompilieren aktiviert sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $status Pflicht | int | Der rohe Statuswert, der von pcntl_wait() oder pcntl_waitpid() per Referenz befüllt wurde. Dieser Wert enthält kodierte Informationen über den Beendigungsgrund des Kindprozesses. |
Rückgabewert
0 und 255). Der Rückgabewert ist nur aussagekräftig, wenn pcntl_wifexited($status) zuvor true zurückgegeben hat.Beispiele
Exit-Code eines Kindprozesses auslesen
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: beendet sich mit Exit-Code 42
exit(42);
} else {
// Elternprozess: wartet auf das Kind
$status = 0;
$childPid = pcntl_wait($status);
if (pcntl_wifexited($status)) {
$exitCode = pcntl_wexitstatus($status);
echo "Kindprozess (PID {$childPid}) beendet mit Exit-Code: {$exitCode}" . PHP_EOL;
} else {
echo "Kindprozess wurde nicht normal beendet." . PHP_EOL;
}
}
Mehrere Kindprozesse überwachen und Exit-Codes auswerten
<?php
$workers = 3;
$pids = [];
for ($i = 0; $i < $workers; $i++) {
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess simuliert Erfolg (0) oder Fehler (1)
$result = ($i % 2 === 0) ? 0 : 1;
exit($result);
} else {
$pids[] = $pid;
}
}
// Elternprozess: alle Kinder einsammeln
foreach ($pids as $pid) {
$status = 0;
pcntl_waitpid($pid, $status);
if (pcntl_wifexited($status)) {
$code = pcntl_wexitstatus($status);
$msg = ($code === 0) ? 'erfolgreich' : 'fehlgeschlagen';
echo "Worker PID {$pid} beendet: {$msg} (Exit-Code {$code})" . PHP_EOL;
}
}
// Wichtig · Fallstricke
Wichtig: pcntl_wexitstatus() sollte nur aufgerufen werden, nachdem pcntl_wifexited($status) den Wert true zurückgegeben hat. Wurde der Kindprozess durch ein Signal beendet (z. B. SIGKILL), ist der Rückgabewert von pcntl_wexitstatus() undefiniert bzw. bedeutungslos.
Der Exit-Code ist systembedingt auf 8 Bit beschränkt, d. h. Werte zwischen 0 und 255. Ein Exit-Code von 0 signalisiert konventionell Erfolg, alle anderen Werte einen Fehler.
Die pcntl-Erweiterung ist nicht Thread-sicher und sollte nicht in Verbindung mit Multi-Threading-Erweiterungen (z. B. pthreads) verwendet werden. Außerdem ist sie ausschließlich für CLI-Skripte geeignet – ihr Einsatz im Web-Server-Kontext (z. B. FPM oder Apache-Modul) ist nicht empfohlen.