Start · Sprachen · PHP · Referenz · pcntl_wifexited

pcntl_wifexited

Funktion

Prüft anhand eines Statuscodes, ob ein Kindprozess normal (d. h. durch <code>exit()</code> oder Rückkehr aus <code>main()</code>) beendet wurde.

seit PHP 4.1.0 Kategorie: misc

Signatur

pcntl_wifexited(int $status): bool

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

Typ
bool
Beschreibung
Gibt 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";
    }
}
Kindprozess normal beendet mit Exit-Code: 42

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";
    }
}
Durch Signal beendet: 15

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