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

时间:2018-02-01 14:52:31

标签: php process echo proc-open

我一直在寻找,但是没有设法找到这个问题的直接答案。在开始时我会说我想要实现的目标并不是特别有用,但目的部分是要了解PHP如何与其他流程和流等交互。

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

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

这就是我现在正在尝试的事情:

$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并不能解决问题。

提前谢谢

1 个答案:

答案 0 :(得分:3)

您正在阅读$pipes[0]。这是stdin。您想要从映射到$pipes[1]的{​​{1}}读取(并且有stdout标记用于写入):

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