Maison >développement back-end >tutoriel php >Comment puis-je capturer à la fois stdout et stderr à partir d'une commande Exec() en PHP ?
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 dans 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"
Le résultat montre les flux stdout et stderr du script test.sh.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!