连接在PHP进程管(Connect pipes of processes in php)

2019-09-21 21:54发布

我想与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,即猫过程的第二描述符连接至该整理过程的第一个描述符? 任何帮助,将不胜感激! 但是,请不要重定向我了shell_exec,因为我希望能够检查出码并记录错误:)。

编辑:

我需要对工作的业务解决方案BTW是:

while(!feof($searchPipes[1])) fwrite($lookupPipes[0], stream_get_line($searchPipes[1], 40000));

这基本上是什么操作系统会做,但我不希望我自己管的管理,因为我有一个内核/ POSIX,并且说实话,这不是1976年:)

Answer 1:

是的,你可以 - 但我认为你有这一轮定义的方式。 您可以使用“排序”为标准输出管道的“猫”的STDIN。 看看下面这对我的作品:

<?php

$txt = "a\nc\ne\nb\nd\n";
$fh  = fopen('data://text/plain;base64,' . base64_encode($txt), 'r');

$sort_pipes = array();
$sort_proc  = proc_open(
    'sort',
    array(
        array('pipe', 'r'),
        STDOUT
    ),
    $sort_pipes
);

$cat_pipes = array();
$cat_proc  = proc_open(
    'cat',
    array(
        $fh,
        $sort_pipes[0]
    ),
    $cat_pipes
);

在第一个两行,我定义的,我不必在文件系统中的某个地方依赖于文件中的文本字符串的数据流。 注意,我有存储的数据流(A,C,E,B,d)在未排序的字符的列表。 运行上面的脚本应该返回排序列表到标准输出。

请注意,您可以根据描述符指定的资源了。 在这种情况下,你必须省略了数组符号,所以:

STDOUT

代替

array(STDOUT)

等等

顺便说一句:你甚至可以直接写入一个文件名指定的文件。 你可以找到在proc_open手工录入描述符规范的进一步信息http://en.php.net/manual/de/function.proc-open.php

编辑

另一种方法也工作,当然:你也可以写“猫”到标准输出管array('pipe', 'w')并使用$cat_pipes[1]作为标准输入“排序”。 :)



文章来源: Connect pipes of processes in php