ec2*_*011 3 php process proc-open echo
我一直在四处寻找,但未能找到这个问题的直接答案。首先,我要声明的是,我想要实现的目标不一定特别有用,但目的部分是为了理解 PHP 如何与其他进程和流等交互。
在 shell 终端,您可以运行一个命令,例如echo $USER,它将输出名为 的环境变量中的任何内容USER。
我想知道是否可以执行此命令,然后echo使用 PHP 的proc_open函数捕获 shell 命令的输出。
这就是我目前正在尝试的:
$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]);
Run Code Online (Sandbox Code Playgroud)
$world保持空(即'')。
我有几个理论来解释为什么它不起作用[以及方括号中的每个理论可能是错误的原因],但我想知道是否有人可以证实其中一个或提供另一种解释为什么它不工作?
理论 1 echo 命令在 PHP 有机会读取输出之前立即终止。[真的吗?有没有办法使用 proc_open 捕获立即终止的命令的输出?也许这不是 proc_open 的用途?]
理论 2
echo 在某种程度上被视为 shell 内置命令而不是独立的可执行文件,这就是它的行为不同的原因?[Linux 提供了一个名为 echo in 的可执行文件/bin/echo,难道它不能只使用那个吗?另外更改echo为/bin/echo也不能解决问题]
先感谢您
您正在阅读来自$pipes[0]. 这是stdin。您想要从中读取$pipes[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);
Run Code Online (Sandbox Code Playgroud)
输出
string(20) "Hello world, guest!
"
Run Code Online (Sandbox Code Playgroud)