Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php proc_open:扩展文件描述符编号以启用;“地位”;来自Perl脚本的反馈_Php_Perl_Proc Open - Fatal编程技术网

Php proc_open:扩展文件描述符编号以启用;“地位”;来自Perl脚本的反馈

Php proc_open:扩展文件描述符编号以启用;“地位”;来自Perl脚本的反馈,php,perl,proc-open,Php,Perl,Proc Open,PHP的手册说明: 文件描述符编号不限于0、1和2-您可以指定任何有效的文件描述符编号,并将其传递给子进程。这允许您的脚本与作为“协同进程”运行的其他脚本进行互操作。特别是,这对于以更安全的方式向PGP、GPG和openssl等程序传递密码短语非常有用。它还可用于在辅助文件描述符上读取这些程序提供的状态信息 发生了什么:我在基于PHP的web应用程序中调用Perl脚本,并在调用中传递参数。我以后不需要向脚本发送数据。通过stdout[1],我从我在PHP应用程序中使用的Perl脚本json_编码

PHP的手册说明:

文件描述符编号不限于0、1和2-您可以指定任何有效的文件描述符编号,并将其传递给子进程。这允许您的脚本与作为“协同进程”运行的其他脚本进行互操作。特别是,这对于以更安全的方式向PGP、GPG和openssl等程序传递密码短语非常有用。它还可用于在辅助文件描述符上读取这些程序提供的状态信息

发生了什么:我在基于PHP的web应用程序中调用Perl脚本,并在调用中传递参数。我以后不需要向脚本发送数据。通过stdout[1],我从我在PHP应用程序中使用的Perl脚本json_编码的数据中接收数据

我想补充的是:Perl脚本正在通过一个网站收集信息,这取决于在其初始调用中传递的参数。我想向PHP应用程序发回一个文本字符串,我可以用它来显示进度条

我认为我应该怎么做:我希望(每1-2秒)轮询为“渐进”更新设置的频道。我将使用Javascript/jQuery写入一个HTMLdiv容器,供用户查看。我不认为我应该将“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";
}
如果我对设置附加通道的理解是正确的(上面的3=>…),那么我将如何在Perl脚本中写入它


感谢您打开一个新的文件句柄并将其复制到文件描述符3:

open STD3, '>&3';
print STDERR "foo\n";
print STD3   "bar\n";

$ perl script.pl 2> file2 3> file3
$ cat file2
foo
$ cat file3
bar

编辑:根据格雷格·培根的评论,
打开STD3,“>&=”,3
打开STD3,>&=3'
直接打开文件描述符,就像C的
fdopen
调用一样,避免了
dup
调用并为您保存了一个文件描述符。

如果您想监控hello world程序的进度,其中,每个步骤都是写入指定文件描述符的点

#! /usr/bin/env perl

use warnings;
use strict;

die "Usage: $0 progress-fd\n" unless @ARGV == 1;

my $fd = shift;
open my $progress, ">&=", $fd or die "$0: dup $fd: $!";

# disable buffering on both handles
for ($progress, *STDOUT) {
  select $_;
  $| = 1;
}

my $output = "Hello, world!\n";

while ($output =~ s/^(.)(.*)\z/$2/s) {
  my $next = $1;
  print $next;
  print $progress ".";
  sleep 1;
}
使用bash语法在
/tmp/progress
上打开fd3并将其连接到程序是不正确的

$ (exec 3>/tmp/progress; ./hello-world 3) Hello, world! $ cat /tmp/progress .............. 你当然可以跳过额外的步骤

$ (exec 17>&2; ./hello-world 17) $(exec 17>&2;/hello world 17) 为了得到同样的效果

如果Perl程序因以下错误而死亡:

$ ./hello-world 333 ./hello-world: dup 333: Bad file descriptor at ./hello-world line 9. 美元/你好世界333 ./hello-world:dup 333:hello-world第9行的文件描述符不正确。
然后,PHP端管道的写入端可能设置了close-on-exec标志。

更直接的是
打开我的$fh,“>&=”,3
.mob,在您和@Greg_-Bacon的帮助下,我已经开始了PHP-perl通信。谢谢但是,即使我让管道变热,我仍然无法在我的网页中写入div,直到ajaxpost(调用php,proc_打开perl脚本)完成。我正在尝试更新perl脚本的状态。长轮询或webSocket是我的两个最佳选择吗?谢谢你的帮助!聪明。我不确定
$(exec 17>&2;/hello world 17)
是做什么的。但是现在我已经在php和perl脚本之间建立了通道,我意识到我陷入了对php脚本的异步ajax调用中,该调用称为perl脚本。我想我需要一个网袋(?)。我将很快标记您的或@mob响应。我感谢你们两位的帮助。谢谢第一部分使FD17与FD2相同(这是终端的标准错误),然后我们告诉hello world将进度指示器写入FD17。因为我们是如何设置管道的,所以终端上也会出现点。暴民是膨胀的;给暴民打勾。 $ (exec 17>&2; ./hello-world 17) $ ./hello-world 333 ./hello-world: dup 333: Bad file descriptor at ./hello-world line 9.