Start · Sprachen · PHP · Referenz · pcntl_wexitstatus

pcntl_wexitstatus

Funktion

Gibt den Exit-Status-Code eines beendeten Kindprozesses zurück, der aus dem von <code>pcntl_wait()</code> oder <code>pcntl_waitpid()</code> gelieferten Statuswert extrahiert wird.

seit PHP 4.1.0 Kategorie: misc

Signatur

pcntl_wexitstatus(int $status): int

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

Typ
int
Beschreibung
Gibt den Exit-Code des Kindprozesses zurück (in der Regel ein Wert zwischen 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;
    }
}
Kindprozess (PID 12345) beendet mit Exit-Code: 42

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;
    }
}
Worker PID 12346 beendet: erfolgreich (Exit-Code 0) Worker PID 12347 beendet: fehlgeschlagen (Exit-Code 1) Worker PID 12348 beendet: erfolgreich (Exit-Code 0)

// 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.