2

proc_open で作成された 1 つのプロセスの出力を、proc_open (php) で作成された別のプロセスにパイプしたいと考えています。例えば。bash では、次のことができます。

[herbert@thdev1 ~]$ cat foo
2
3
1
[herbert@thdev1 ~]$ cat foo | sort
1
2
3
[herbert@thdev1 ~]$ 

戻りコード、パイプなどを制御するために、(shell_exec の代わりに) proc_open を使用して 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

「|」をシミュレートする方法を誰かが知っていますか つまり、cat-process の 2 番目の記述子を sort-process の最初の記述子に接続しますか? どんな助けでも大歓迎です!ただし、終了コードを確認してエラーをログに記録できるようにしたいので、shell_exec にリダイレクトしないでください :)。

編集:

私の仕事に必要なビジネスソリューションは次のとおりです。

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

これは基本的にOSが行うことですが、私はそのためのカーネル/posixを持っているので、私自身のパイプ管理はしたくありません。正直に言うと、それは1976年ではありません:)

4

1 に答える 1

2

はい、できますが、これは逆に定義する必要があると思います。「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
);

最初の 2 行では、ファイル システムのどこかにあるファイルに依存する必要のないテキスト文字列からデータ ストリームを定義しました。データストリームに保存されているソートされていない文字のリストがあることに注意してください(a、c、e、b、d)。上記のスクリプトを実行すると、並べ替えられたリストが STDOUT に返されます。

リソースを記述子として指定することもできます。この場合、配列表記を省略する必要があるため、次のようになります。

STDOUT

それ以外の

array(STDOUT)

ところで、ファイル名で指定されたファイルに直接書き込むこともできます。記述子仕様の詳細については、 http: //en.php.net/manual/de/function.proc-open.php の proc_open のマニュアル エントリを参照してください。

編集

もちろん、他の方法も機能します。「cat」を STDOUT パイプに書き込んで、「sort」の STDIN としてarray('pipe', 'w')使用することもできます。$cat_pipes[1]:)

于 2012-09-07T07:42:51.610 に答える