Frage

Ich habe eine Eltern-/Arbeiter -Vereinbarung. Der Elternteil hält die Arbeiterpids in einem Array und prüft ständig, dass sie mit der folgenden Schleife noch am Leben sind:

// $workers is an array of PIDs
foreach ($workers as $workerID => $pid) {
    // Check if this worker still exists as a process
    pcntl_waitpid($pid, $status, WNOHANG|WUNTRACED);

    // If the worker exited normally, stop tracking it
    if (pcntl_wifexited($status)) {
        $logger->info("Worker $workerID exited normally");
        array_splice($workers, $workerID, 1); 
    }

    // If it has a session ID, then it's still living
    if (posix_getsid($pid))⋅
        $living[] = $pid;
}

// $dead is the difference between workers we've started
// and those that are still running
$dead = array_diff($workers, $living);

Das Problem ist, dass pcntl_waitpid() setzt immer $status Zu 0, als diese Schleife zum ersten Mal ausgeführt wird, glaubt der Elternteil, dass alle ihre Kinder normal verlassen sind, obwohl sie immer noch laufen. Benutze ich pcntl_waitpid() Falsch oder erwarten, dass es etwas tut, was es nicht tut?

War es hilfreich?

Lösung

Einfach, das Kind ist nicht verlassen oder aufgehört. Sie haben die hinzugefügt WNOHANG Flag, so dass es immer sofort zurückkehrt (es gibt der Funktion an, nicht auf ein Ereignis zu warten). Was Sie tun sollten, ist, den Rückgabewert von zu überprüfen pcntl_waitpid Um zu sehen, ob etwas Wertes zurückgegeben wurde (vorausgesetzt, Sie möchten nur den Inhalt der Schleife ausführen, wenn sich eine Statusänderung vorliegt):

foreach ($workers as $workerID => $pid) {
    // Check if this worker still exists as a process
    if (pcntl_waitpid($pid, $status, WNOHANG|WUNTRACED)) {
        // If the worker exited normally, stop tracking it
        if (pcntl_wifexited($status)) {
            $logger->info("Worker $workerID exited normally");
            array_splice($workers, $workerID, 1); 
        }
        // If it has a session ID, then it's still living
        if (posix_getsid($pid))⋅
            $living[] = $pid;
    }
}    

Andere Tipps

Du bist in der Tat "benutzt pcntl_waitpid() falsch "(Beachten Sie die Zitate)

Da du benutzt WNOHANG, nur wenn pcntl_waitpid() Gibt die PID des Kindes zurück, Sie können bewerten, was sich befindet $status.

Sehen Rückgabewerte zum pcntl_waitpid().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top