Heim >Backend-Entwicklung >PHP-Tutorial >Wie kann ich sowohl stdout als auch stderr von einem Exec()-Befehl in PHP erfassen?

Wie kann ich sowohl stdout als auch stderr von einem Exec()-Befehl in PHP erfassen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-30 03:28:16300Durchsuche

How Can I Capture Both stdout and stderr from an Exec() Command in PHP?

PHP StdErr nach Exec()

In PHP führt die Funktion exec() einen Befehl aus und gibt die Ausgabe von der Standardausgabe des Befehls zurück. Wenn der Befehl jedoch in stderr schreibt, wird diese Ausgabe nicht von exec() erfasst.

Um sowohl stdout als auch stderr von einem Befehl zu erfassen, können Sie die Funktion proc_open() verwenden. proc_open() bietet ein höheres Maß an Kontrolle über den Befehlsausführungsprozess, einschließlich der Möglichkeit, die stdin-, stdout- und stderr-Streams des Befehls weiterzuleiten.

Beispiel:

Betrachten wir das folgende Shell-Skript test.sh, das sowohl in stderr als auch schreibt stdout:

#!/bin/bash

echo 'this is on stdout';
echo 'this is on stdout too';

echo 'this is on stderr' >&2;
echo 'this is on stderr too' >&2;

Um dieses Skript in PHP auszuführen und sowohl stdout als auch stderr zu erfassen, können Sie den folgenden Code verwenden:

$descriptorspec = [
    0 => ['pipe', 'r'],  // stdin
    1 => ['pipe', 'w'],  // stdout
    2 => ['pipe', 'w'],  // stderr
];

$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);

$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);

$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);

echo "stdout : \n";
var_dump($stdout);

echo "stderr :\n";
var_dump($stderr);

Ausgabe:

Wenn Sie das obige PHP-Skript ausführen, erhalten Sie die folgende Ausgabe:

stdout :
string(40) "this is on stdout
this is on stdout too"
stderr :
string(40) "this is on stderr
this is on stderr too"

Die Ausgabe wird angezeigt die stdout- und stderr-Streams aus dem test.sh-Skript.

Das obige ist der detaillierte Inhalt vonWie kann ich sowohl stdout als auch stderr von einem Exec()-Befehl in PHP erfassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn