我希望使用 proc_open 创建的一个进程的输出通过管道传输到使用 proc_open(在 php 中)创建的另一个进程。例如。在 bash 我可以这样做:
[herbert@thdev1 ~]$ cat foo
2
3
1
[herbert@thdev1 ~]$ cat foo | sort
1
2
3
[herbert@thdev1 ~]$
我想使用 proc_open(而不是 shell_exec)在 php 中模拟这个,以便控制返回码、管道等。所以我想要这样的东西:
$catPipes=array();
$sortPipes=array();
$cwd = '/tmp';
$env = array();
$catProcess = proc_open("cat foo", array(
0 => array("pipe", "r"),
1 => array("pipe", "w")
), $catPipes, $cwd, $env);
$sortProcess = proc_open("sort", array(
0 => array("pipe", "r", $catPipes[1]),
1 => array("pipe", "w"),
), $sortPipes, $cwd, $env);
echo stream_get_contents($sortPipes[1]);
fclose($sortPipes[1]);
//proc_close(this) ... proc_close(that) ... etc
有人知道我如何模拟“|” php中的bash,即将cat-process的第二个描述符连接到sort-process的第一个描述符?任何帮助,将不胜感激!但请不要将我重定向到 shell_exec,因为我希望能够检查退出代码并记录错误:)。
编辑:
顺便说一句,我需要工作的业务解决方案是:
while(!feof($searchPipes[1])) fwrite($lookupPipes[0], stream_get_line($searchPipes[1], 40000));
这基本上是操作系统会做的事情,但我不想自己进行管道管理,因为我有一个内核/posix,老实说,这不是 1976 年 :)