PHPのproc_openマニュアルには、次のように記載されています。
ファイル記述子番号は0、1、および2に限定されません。有効なファイル記述子番号を指定すると、子プロセスに渡されます。これにより、スクリプトを「コプロセス」として実行される他のスクリプトと相互運用できます。特に、これは、パスフレーズをPGP、GPG、opensslなどのプログラムに安全な方法で渡す場合に役立ちます。また、補助ファイル記述子でこれらのプログラムによって提供されるステータス情報を読み取る場合にも役立ちます。
何が起こるか: PHPベースのWebアプリケーションでPerlスクリプトを呼び出し、その呼び出しでパラメーターを渡します。今後、スクリプトにデータを送信する必要はありません。stdout [1]を介して、PHPアプリケーションで使用するjson_encodedデータをPerlスクリプトから受け取ります。
追加したいこと: Perlスクリプトは、最初の呼び出しで渡されたパラメーターに応じて情報を収集するWebサイトを進行しています。一種のプログレスバーとして表示するために使用できるテキスト文字列をPHPアプリケーションに送り返したいと思います。
どのようにすべきか:その「プログレッション」アップデート用に設定されたチャネルを(1〜2秒ごとに)ポーリングすることを期待します。Javascript / jQueryを使用して、ユーザーが表示できるようにhtmldivコンテナーに書き込みます。stdoutストリームを解読する必要があるため、「progress」チャネルをより重要な「json_encode(data)」チャネルと混合する必要はないと思います。(これは論理的で実用的ですか?)
私の主な質問:追加の「ファイル記述子」 をどのように使用しますか?以下の3=>...のように、追加のチャネルの設定を簡単にイメージします。
$tunnels = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
3 => array('pipe', 'w')
);
$io = array();
$resource = proc_open("perl file/tomy/perl/code.pl $param1 $param2 $param3", $tunnels, $io);
if(!is_resource($resource)) {
$error = "No Resource";
}
fclose($io[0]);
$perlOutput = stream_get_contents($io[1]);
$output = json_decode($perlOutput);
$errors = stream_get_contents($io[2]);
print "$errors<p>";
fclose($io[1]);
fclose($io[2]);
$result = proc_close($resource);
if($result != 0) {
echo "you returned a $result result on proc_close";
}
しかし、Perlスクリプトでは、次のようにstdoutに書き込むだけです。
my $json_terms = encode_json(\@terms);
print $json_terms;
追加のチャネルを設定するという私の理解が正しければ(上記の3 => ...)、Perlスクリプト内でどのようにチャネルに書き込むのでしょうか?
ありがとう