我一直在寻找,但是没有设法找到这个问题的直接答案。在开始时我会说我想要实现的目标并不是特别有用,但目的部分是要了解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
并不能解决问题。
提前谢谢
答案 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);