首页 >后端开发 >php教程 >如何从 PHP 中的 Exec() 命令捕获 stdout 和 stderr?

如何从 PHP 中的 Exec() 命令捕获 stdout 和 stderr?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-30 03:28:16289浏览

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

Exec() 之后的 PHP StdErr

在 PHP 中,exec() 函数执行命令并从命令的 stdout 返回输出。但是,如果命令写入 stderr,则 exec() 不会捕获此输出。

要从命令捕获 stdout 和 stderr,可以使用 proc_open() 函数。 proc_open() 提供对命令执行过程的更高级别的控制,包括通过管道传输命令的 stdin、stdout 和 stderr 流的能力。

示例:

让我们考虑以下 shell 脚本 test.sh,它同时写入 stderr 和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;

要在 PHP 中执行此脚本并捕获 stdout 和 stderr,您可以使用以下代码:

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

输出:

当你执行上面的PHP脚本时,你会得到以下结果输出:

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

输出显示 test.sh 脚本中的 stdout 和 stderr 流。

以上是如何从 PHP 中的 Exec() 命令捕获 stdout 和 stderr?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn