"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je capturer à la fois stdout et stderr à partir d’une commande Exec() en PHP ?

Comment puis-je capturer à la fois stdout et stderr à partir d’une commande Exec() en PHP ?

Publié le 2024-12-13
Parcourir:209

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

PHP StdErr après Exec()

En PHP, la fonction exec() exécute une commande et renvoie la sortie de la sortie standard de la commande. Cependant, si la commande écrit sur stderr, cette sortie n'est pas capturée par exec().

Pour capturer à la fois stdout et stderr à partir d'une commande, vous pouvez utiliser la fonction proc_open(). proc_open() offre un plus grand niveau de contrôle sur le processus d'exécution de la commande, y compris la possibilité de rediriger les flux stdin, stdout et stderr de la commande.

Exemple :

Considérons le script shell suivant, test.sh, qui écrit à la fois sur stderr et 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;

Pour exécuter ce script en PHP et capturer à la fois stdout et stderr, vous pouvez utiliser le code suivant :

$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);

Sortie :

Lorsque vous exécutez le script PHP ci-dessus, vous obtiendrez le résultat suivant :

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

La sortie montre les flux stdout et stderr du script test.sh.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3