Signatur
Beschreibung
pcntl_get_last_error() liefert den systemseitigen Fehlercode (errno), der beim letzten fehlgeschlagenen Aufruf einer PCNTL-Funktion gesetzt wurde. Dieser Wert entspricht dem POSIX-errno und kann mit pcntl_strerror() in eine lesbare Fehlermeldung umgewandelt werden.
Die Funktion ist besonders nützlich, wenn Prozesssteuerungs-Funktionen wie pcntl_fork(), pcntl_waitpid() oder pcntl_signal() fehlschlagen und man den genauen Fehlergrund ermitteln möchte. Ohne diese Funktion wäre es schwierig, zwischen verschiedenen Fehlerursachen zu unterscheiden (z. B. keine Ressourcen verfügbar vs. ungültiger Parameter).
Zu beachten ist, dass der gespeicherte Fehlercode erst beim nächsten Aufruf einer PCNTL-Funktion überschrieben wird. Er sollte daher unmittelbar nach einem fehlgeschlagenen Aufruf abgerufen werden, um korrekte Ergebnisse zu erhalten.
Die zurückgegebenen Fehlercodes entsprechen den POSIX-Konstanten, etwa PCNTL_ECHILD, PCNTL_EINVAL, PCNTL_ENOMEM usw., die direkt verglichen werden können.
Rückgabewert
errno-Fehlercode des zuletzt fehlgeschlagenen PCNTL-Aufrufs zurück. Wurde noch kein Fehler registriert oder war der letzte Aufruf erfolgreich, wird 0 zurückgegeben.Beispiele
Fehlerbehandlung nach pcntl_waitpid()
<?php
// Nur auf Systemen mit PCNTL-Unterstützung ausführen (Linux/macOS, CLI)
$pid = pcntl_fork();
if ($pid === -1) {
// fork() fehlgeschlagen
$errno = pcntl_get_last_error();
$message = pcntl_strerror($errno);
echo "pcntl_fork() fehlgeschlagen. Fehlercode: {$errno} – {$message}" . PHP_EOL;
} elseif ($pid === 0) {
// Kind-Prozess
echo "Kind-Prozess läuft (PID: " . posix_getpid() . ")" . PHP_EOL;
exit(0);
} else {
// Eltern-Prozess wartet auf Kind
$result = pcntl_waitpid($pid, $status);
if ($result === -1) {
$errno = pcntl_get_last_error();
$message = pcntl_strerror($errno);
echo "pcntl_waitpid() fehlgeschlagen. Fehlercode: {$errno} – {$message}" . PHP_EOL;
} else {
echo "Kind-Prozess {$pid} beendet mit Status: " . pcntl_wexitstatus($status) . PHP_EOL;
}
}
Fehlercode mit POSIX-Konstante vergleichen
<?php
// Einen ungültigen Warte-Aufruf provozieren (nicht existierende PID)
$result = pcntl_waitpid(-999, $status, WNOHANG);
if ($result === -1) {
$errno = pcntl_get_last_error();
echo "Fehlercode: {$errno}" . PHP_EOL;
echo "Fehlermeldung: " . pcntl_strerror($errno) . PHP_EOL;
if ($errno === PCNTL_ECHILD) {
echo "Kein Kind-Prozess vorhanden (ECHILD)." . PHP_EOL;
} elseif ($errno === PCNTL_EINVAL) {
echo "Ungültige Optionen übergeben (EINVAL)." . PHP_EOL;
} else {
echo "Unbekannter Fehler." . PHP_EOL;
}
}
// Wichtig · Fallstricke
Verfügbarkeit: PCNTL-Funktionen sind nur auf Unix-artigen Systemen (Linux, macOS) verfügbar und funktionieren ausschließlich im CLI-SAPI. In Webserver-Umgebungen (Apache, FPM) sollten sie nicht eingesetzt werden, da dies zu unvorhersehbarem Verhalten führen kann.
Reihenfolge beachten: pcntl_get_last_error() sollte unmittelbar nach dem fehlgeschlagenen Aufruf aufgerufen werden, da jeder weitere PCNTL-Aufruf den Fehlercode überschreiben kann – auch wenn dieser erfolgreich war (dann wird 0 gesetzt).
Die POSIX-Fehlerkonstanten (z. B. PCNTL_ECHILD, PCNTL_ENOMEM) sind als PHP-Konstanten verfügbar und ermöglichen portablen, lesbaren Vergleich der Fehlercodes.