Aktueller Standort: Startseite> Neueste Artikel> Wie kann ich Proc_termate verwenden, um mit Stream_Get_Contents zusammenzuarbeiten, um die Ausgabe von untergeordneten Prozessen zu erhalten?

Wie kann ich Proc_termate verwenden, um mit Stream_Get_Contents zusammenzuarbeiten, um die Ausgabe von untergeordneten Prozessen zu erhalten?

gitbox 2025-06-09

1. Was ist Proc_open ?

Proc_open ist eine Funktion in PHP, die es uns ermöglicht, einen Prozess zu starten und mit ihm zu interagieren. Sie können die Ausgabe eines untergeordneten Prozesses lesen, Eingaben schreiben und sogar die Fehlerausgabe des Prozesses erhalten. Im Gegensatz zu EXEC oder Shell_exec kann Proc_open leistungsfähigere Steuerfunktionen liefern.

2. Wie kann man Proc_open verwenden, um einen Kinderprozess zu starten?

Zunächst müssen wir Proc_open verwenden, um einen Kinderprozess zu starten. Der erste Parameter von proc_open ist die Befehlszeichenfolge, der zweite Parameter ist die Pipeline -Konfiguration und der dritte Parameter ist das Array, mit dem untergeordnete Prozessausgabe und Fehler empfangen werden.

Hier ist ein einfaches Beispiel:

 $cmd = "ls -l";  // Sie können es durch jeden Befehl ersetzen
$descriptorspec = [
    1 => ['pipe', 'w'],  // Standardausgabe
    2 => ['pipe', 'w'],  // Standardfehler
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // Lesen Sie die Ausgabe des Kinderprozesses
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 读取Standardfehler(Wenn es gibt)
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // Den Prozess schließen
    $exit_code = proc_close($process);

    echo "Output:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }
    echo "Exit Code: " . $exit_code . "\n";
}

In diesem Beispiel starten wir den Befehl ls -l und verwenden stream_get_contents , um seine Standardausgabe- und Standardfehler zu lesen. Proc_open ermöglicht es uns, während der Ausführung mit dem Prozess zu interagieren, während Stream_get_Contents verwendet wird, um den Inhalt im Ausgabestrom zu erhalten.


3.. Verwenden Sie Proc_terate , um das untergeordnete Prozess zu beenden

In einigen Fällen kann es erforderlich sein, den Kinderprozess zum Ende zu zwingen, insbesondere wenn der Kinderprozess zu lang dauert oder festsitzt. Mit der Proc_terminate -Funktion kann ein laufender Kinderprozess beendet werden.

Hier ist ein Beispiel für die Beendigung eines Prozesses mit Proc_terate :

 $cmd = "sleep 10";  // Lassen Sie den Prozess schlafen10Zweite,Einen langen Laufprozess zu simulieren
$descriptorspec = [
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // 等待几Zweite钟后终止子进程
    sleep(3);
    proc_terminate($process);  // Erzwungene Beendigung des Prozesses

    // Lesen Sie Ausgabe und Fehler
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    echo "Output after termination:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }

    // Holen Sie sich den Prozess -Beenden -Code
    $exit_code = proc_close($process);
    echo "Exit Code: " . $exit_code . "\n";
}

In diesem Beispiel haben wir einen lang Laufprozess mit Sleep 10 simuliert und den Prozess nach 3 Sekunden mit Proc_terate beendet. Beachten Sie, dass wir nach Beendigung des Prozesses die Ausgabe- und Fehlerinformationen des untergeordneten Prozesss erhalten können.


4. umfassendes Beispiel: Wie kann der Kinderprozessausgang und die Fehler gleichzeitig und den Prozess kontrollieren?

Wenn Sie den vorherigen Inhalt kombinieren, zeigt dies ein vollständiges Beispiel, das zeigt, wie ein Prozess gestartet, Ausgabe abgerufen, Fehlerausgabe abgerufen und den Vorgang gegebenenfalls beendet wird.

 $cmd = "ping -c 4 google.com";  // Befehle zum Testen,ping Google
$descriptorspec = [
    1 => ['pipe', 'w'],  // Standardausgabe
    2 => ['pipe', 'w'],  // Standardfehler
];

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {
    // Lesen Sie die Ausgabe des Prozesses
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 读取Standardfehler输出
    $error_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // Den Prozess schließen并获取退出代码
    $exit_code = proc_close($process);

    echo "Output:\n" . $output . "\n";
    if ($error_output) {
        echo "Error Output:\n" . $error_output . "\n";
    }

    echo "Exit Code: " . $exit_code . "\n";
}

In diesem Beispiel verwenden wir den Ping -Befehl, um eine Netzwerkverbindung zu testen und den Prozess über Proc_open zu starten, um die Ausgabe- und Fehlerinformationen zu lesen.