PHP 的proc_open手册指出:
文件描述符编号不限于 0、1 和 2 - 您可以指定任何有效的文件描述符编号,并将其传递给子进程。这允许您的脚本与作为“协同进程”运行的其他脚本进行互操作。特别是,这对于以更安全的方式将密码短语传递给 PGP、GPG 和 openssl 等程序很有用。它对于读取那些程序在辅助文件描述符上提供的状态信息也很有用。
发生了什么: 我在基于 PHP 的 Web 应用程序中调用 Perl 脚本并在调用中传递参数。我以后不需要向脚本发送数据。通过标准输出 [1],我从我在 PHP 应用程序中使用的 Perl 脚本 json_encoded 数据中接收到这些数据。
我想补充 的是:Perl 脚本正在通过网站收集信息,具体取决于在其初始调用中传递的参数。我想向 PHP 应用程序发送回一个文本字符串,我可以用它来显示为一种进度条。
我认为我应该怎么做:我希望(每 1-2 秒)轮询为该“进度”更新设置的频道。我会使用 Javascript / jQuery 写入一个 html div 容器供用户查看。我认为我不应该将“进度”通道与更关键的“json_encode(数据)”通道混合,因为我需要破译标准输出流。(这个想法合乎逻辑、实用吗?)
我的主要问题: 您如何使用其他“文件描述符”?我会将附加通道的设置想象为简单明了,例如下面的 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 脚本中,我只是像这样写到标准输出:
my $json_terms = encode_json(\@terms);
print $json_terms;
如果我对设置附加通道的理解是正确的(上面是 3 => ...),那么我将如何在 Perl 脚本中写入它?
谢谢