PHP的proc_open手册说明如下:
但是,在Perl脚本中,我只需要像这样写入标准输出:
如果我正确理解了设置额外通道的过程(如上所述,3 => …),那么我该如何在Perl脚本中向其写入内容?
谢谢。
发生了什么:我在基于PHP的Web应用程序中调用一个Perl脚本并在调用中传递参数。我没有未来需要向脚本发送数据的需求。通过stdout [1],我从Perl脚本接收到json_encoded数据,我在我的PHP应用程序中使用它。 我想要添加的内容:Perl脚本正在通过网站收集信息,具体取决于其初始调用中传递的参数。我想向PHP应用程序发送一个文本字符串,我可以将其显示为一种进度条。 我认为应该如何做:我希望每秒轮询(每1-2秒)已设置的“progression”更新通道。我将使用Javascript / jQuery编写到html div容器中供用户查看。我认为我不应将“进度”通道与更重要的“json_encode(data)”通道混合在一起,因为那样我就需要解密stdout流。 (这种想法是否合乎逻辑,实用?) 我的主要问题:如何使用其他“文件描述符号?”我认为设置其他通道是很简单的,例如下面的3 => ...:文件描述符号不仅限于0、1和2 - 您可以指定任何有效的文件描述符号,它将传递给子进程。这使您的脚本能够与其他作为“协处理器”运行的脚本进行交互。特别是,这对于以更安全的方式向PGP、GPG和openssl之类的程序传递口令以及从这些程序提供的辅助文件描述符上读取状态信息非常有用。
$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脚本中,我只需要像这样写入标准输出:
my $json_terms = encode_json(\@terms);
print $json_terms;
如果我正确理解了设置额外通道的过程(如上所述,3 => …),那么我该如何在Perl脚本中向其写入内容?
谢谢。
open my $fh, ">&=", 3
。 - Greg Bacon