【问题标题】:PHP Use proc_open and capture stdout of 'echo' commandPHP 使用 proc_open 并捕获“echo”命令的标准输出
【发布时间】:2018-02-01 14:52:31
【问题描述】:

我一直在四处寻找,但没有找到这个问题的直接答案。一开始我会声明,我想要实现的目标不一定特别有用,但部分目的是了解 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 也不能解决问题]


提前谢谢你

【问题讨论】:

    标签: php process echo proc-open


    【解决方案1】:

    您正在阅读来自$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!
    "
    

    【讨论】:

    • 感谢您指出这一点! ??? 简直不敢相信就是这样。实际上这是对原始代码的简化摘录,但是知道这 确实 工作使我能够弄清楚我最初的问题只是我没有等待足够长的时间来读取 stdout 的输出,因为我也启用了非阻塞模式。我会接受这个答案,也许这对于其他刚刚学习如何使用进程 IO 和流的人来说是一个有用的参考。
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2011-06-28
    相关资源
    最近更新 更多