php - 在php中连接进程的管道

标签 php resources stream pipe proc-open

我希望将使用 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 进程的第二个描述符连接到 sort 进程的第一个描述符?任何帮助,将不胜感激!但请不要将我重定向到 shell_exec,因为我希望能够检查退出代码和日志错误:)。

编辑:

顺便说一句,我需要的工作业务解决方案是:

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

这基本上是操作系统会做的事情,但我不想自己的管道管理,因为我有一个内核/posix,老实说,这不是 1976 年:)

最佳答案

是的,你可以——但我认为你必须反过来定义它。您可以使用“sort”的 STDIN 作为“cat”的 STDOUT 管道。看看以下对我有用的内容:

<?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。

请注意,您也可以将资源指定为描述符。在这种情况下,您必须省略数组符号,因此:

STDOUT

而不是

array(STDOUT)

等等

顺便说一句:您甚至可以直接写入由文件名指定的文件。您可以在 proc_open 的手册条目 http://en.php.net/manual/de/function.proc-open.php 中找到有关描述符规范的更多信息。

编辑

当然,另一种方法也有效:您还可以将“cat”写入 STDOUT 管道 array('pipe', 'w') 并使用 $cat_pipes[1] 作为“排序”的 STDIN。 :)

关于php - 在php中连接进程的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12179978/

相关文章:

PHP PDO 返回错误结果

algorithm - 选择食谱以最大限度地利用成分——算法的名称是什么?

android - 使用 attrs 的自定义 View 背景导致崩溃

java - 使用 Java 8 流查找 List<Object> 中值的总计

node.js - NodeJs 解压缩流

asp.net - 从 ASP.NET Core Web API 将多 GB 文件流式传输到 AWS S3

php - Laravel 5 和 Angular 从 Controller 获取 JSON

php - 如何从此查询中选择最新日期(不在现有表中)?

PHP方程输出困惑

javascript - 在jira插件中使用静态资源(例如JQuery)