PHP 使用 proc_open 并捕获 'echo' 命令的标准输出

标签 php process echo proc-open

我一直在四处寻找,但没有设法找到这个问题的直接答案。一开始我会声明我试图实现的目标不一定特别有用,但部分目的是为了了解 PHP 如何与其他进程和流等交互。

例如,在 shell 终端,您可以运行类似 echo $USER 的命令,它将输出名为 USER 的环境变量中的任何内容。

我想知道是否可以执行此命令,然后使用 PHP 的 proc_open 函数捕获 shell echo 命令的输出。

这就是我目前正在尝试的:

$descriptors = [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']];
$handle = proc_open('echo Hello world, $USER!', $descriptors, $pipes, null, ['USER' => 'guest']);
$world = stream_get_contents($pipes[0]);

$world 保持空白(即 '')。

我有几个关于为什么它不起作用的理论 [以及方括号中每个理论可能是错误的原因] 但我想知道是否有人可以确认其中一个或提供另一个请解释为什么它不起作用?


理论 1 echo 命令在 PHP 有机会读取输出之前立即终止。 [真的?有没有办法使用 proc_open 来捕获立即终止的命令的输出?也许这不是 proc_open 的目的?]

理论 2 echo 以某种方式被视为 shell 内置命令而不是独立的可执行文件,这就是它表现不同的原因? [Linux 在/bin/echo 中提供了一个名为echo 的可执行文件,它不能只使用那个吗?另外将 echo 更改为 /bin/echo 也不能解决问题]


提前致谢

最佳答案

您正在从 $pipes[0] 读取数据。这是 stdin。您想从映射到 stdout$pipes[1] 中读取(并且具有用于写入的 w 标志):

$descriptors = [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']];
$handle = proc_open('echo Hello world, $USER!', $descriptors, $pipes, null, ['USER' => 'guest']);
$world = stream_get_contents($pipes[1]);
var_dump($world);

输出

string(20) "Hello world, guest!
"

关于PHP 使用 proc_open 并捕获 'echo' 命令的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565598/

相关文章:

windows - 如何回显以数字结尾的字符串?

python - 从批处理文件运行 python 脚本时,如何自动将输入值传递给 python "input"函数

php - if 语句在 echo?

php - 无法回显文件 python 中的值

php - 如果使用 PHP 则跳过 parent

php - Elasticsearch:为PHP数组中的多个匹配设置参数

linux - 监控进程

php - composer 依赖声明它没有 php-xsl

c# - "File not found"使用 Process.Start() 启动 system32\winsat.exe 时出错

python - 有没有办法使用 Perl 或 Python 检索进程统计信息?