在Perl脚本仍在运行时在浏览器中显示控制台输出

这是我正在测试的非常简单的程序</ p>

 #  !/ usr / bin / perl 

print“这是测试脚本
”;
sleep(5);

print“这是测试脚本
”;
sleep(5);

print“ 这是测试脚本
“;
sleep(5);

print”这是测试脚本
“;
sleep(5);

print”这是测试脚本
“;
sleep(5 );

print“脚本测试完成
”;
</ code> </ pre>

现在PHP应该每隔10秒输出一次脚本输出(将进入控制台)或 5秒或当php看到控制台上的输出时。</ p>

我有数百个perl脚本,我不能去更改那些脚本并将输出定向到php / ajax可以的文件 获取内容并输出到浏览器。</ p>

谢谢</ p>
</ div>

展开原文

原文

Here's very simple program that I am testing on

#!/usr/bin/perl

print "This is Test Script
";
sleep(5);

print "This is Test Script
";
sleep(5);

print "This is Test Script
";
sleep(5);

print "This is Test Script
";
sleep(5);

print "This is Test Script
";
sleep(5);

print "Script Testing Done
";

Now PHP should output the script output (which is going to console) every maybe 10 seconds or 5 seconds or whenever the php sees the output on the console.

I have hundreds of perl scripts and I cannot go and change those script and direct the output to a file where php/ajax can get the content and output to the browser.

Thanks

dongyi2006
dongyi2006 是的,我正在从PHP调用Perl脚本。
接近 10 年之前 回复
dopzc64662
dopzc64662 非常相似的问题(答案很好):stackoverflow.com/questions/1181135/...
接近 10 年之前 回复
duanbi2760
duanbi2760 等等,什么?您正在使用PHP调用Perl脚本吗?
接近 10 年之前 回复

3个回答



您可能需要 proc_open ()</ code> flush()</ code> 。</ p >

前者允许您随意读/写进程。 后者刷新输出缓冲区。</ p>

(编辑,添加示例代码)</ p>

以下是调用上述Perl示例的示例PHP脚本(假设 它叫做 test.pl </ code>)。 请注意,由于Perl的输出缓冲机制,您需要告诉Perl脚本使STDOUT隐式刷新(或在Perl-speak中“使其变热”)。 您可以通过在Perl脚本的顶部添加 $ | = 1 </ code>来完成此操作。</ p>

 &lt;?php 

$ descriptor = array(
0 =&gt; array(“pipe”,“r”),// stdin
1 =&gt; array(“pipe”,“w”),// stdout
2 =&gt; array( “pipe”,“w”),// stderr
);

$ proc = proc_open('。/ test.pl',$ descriptor,$ pipes);
if($ proc){
fclose ($管[0]); //没有输入
stream_set_blocking($ pipes [1],0); //关闭阻塞
while(!feof($ pipes [1])){
echo“PHP&gt;(heartbeat)
”;
$ fromPerl = fread($ pipes [1],1024); //读取最多1k
if($ fromPerl){
echo“Perl&gt; {$ fromPerl}”;
}
sleep(2); //做其他工作而不是
}

proc_close($ proc);
}
</ code> </ pre>

以下是输出:</ p>

  $ time php proc.php 
PHP&gt; (心跳)\ NPHP&GT; (心跳)
Perl&GT; 这是测试脚本

PHP&gt; (心跳)\ NPHP&GT; (心跳)
Perl&GT; 这是测试脚本

PHP&gt; (心跳)\ NPHP&GT; (心跳)\ NPHP&GT; (心跳)
Perl&GT; 这是测试脚本

PHP&gt; (心跳)\ NPHP&GT; (心跳)
Perl&GT; 这是测试脚本

PHP&gt; (心跳)\ NPHP&GT; (心跳)\ NPHP&GT; (心跳)
Perl&GT; 这是测试脚本

PHP&gt; (心跳)\ NPHP&GT; (心跳)
Perl&GT; 脚本测试完成
PHP&gt; (心跳)

real 0m30.031s
user 0m0.020s
sys 0m0.018s
</ code> </ pre>
</ div>

展开原文

原文

You probably want proc_open() and flush().

The former allows you to read/write to processes at will. The latter flushes the output buffer.

(Edit, add example code)

Here is a sample PHP script that invokes your Perl sample above (assuming its called test.pl). Note that due to Perl's output buffering mechanism, you need to tell your Perl script to make STDOUT implicitly flush (or "make it hot" in Perl-speak). You can do this by adding $|=1 at the top of your Perl script.

<?php

$descriptor = array(
   0 => array("pipe", "r"), // stdin
   1 => array("pipe", "w"), // stdout
   2 => array("pipe", "w"), // stderr
);

$proc = proc_open('./test.pl', $descriptor, $pipes);
if ($proc) {
    fclose($pipes[0]); // no input
    stream_set_blocking($pipes[1], 0); // turn off blocking
    while (!feof($pipes[1])) {
        echo "PHP> (heartbeat)
";
        $fromPerl = fread($pipes[1], 1024); // read up to 1k
        if ($fromPerl) {
            echo "Perl> {$fromPerl}";
        }
        sleep(2); // do other work instead
    }
    proc_close($proc);
}

Here is the output:

$ time php proc.php 
PHP> (heartbeat)
PHP> (heartbeat)
Perl> This is Test Script
PHP> (heartbeat)
PHP> (heartbeat)
Perl> This is Test Script
PHP> (heartbeat)
PHP> (heartbeat)
PHP> (heartbeat)
Perl> This is Test Script
PHP> (heartbeat)
PHP> (heartbeat)
Perl> This is Test Script
PHP> (heartbeat)
PHP> (heartbeat)
PHP> (heartbeat)
Perl> This is Test Script
PHP> (heartbeat)
PHP> (heartbeat)
Perl> Script Testing Done
PHP> (heartbeat)

real    0m30.031s
user    0m0.020s
sys 0m0.018s

dsjz1119
dsjz1119 +1 @scoates:但是有没有为什么要返回SUCCESS / FAILURE标志并停止perl进程......就这样,提前谢谢
8 年多之前 回复
dongshi9407
dongshi9407 如果它回答你的问题,你应该接受它( - :如果没有,哪个部分还不清楚?
接近 10 年之前 回复
doukou4066
doukou4066 非常感谢Scoates ......那个例子太棒了......我真的很欣赏它。
接近 10 年之前 回复
duanhuan3012
duanhuan3012 我添加了一个示例脚本及其输出。
接近 10 年之前 回复
duanche4578
duanche4578 您好Scoates,您能提供一些代码,我如何使用这两个功能?
接近 10 年之前 回复



我可能会在这里咆哮错误的树,但是你不可能遭受缓冲?</ p>
</ div>

展开原文

原文

I might be barking up the wrong tree here, but isn't it possible that you are Suffering from Buffering?



嗯,回到过去我会使用带有非解析标题的CGI(NPH ... google it)和 $ | = 1 </ code>“当你希望你的管道管道很热”时。</ p>

你将不得不做一些与PHP方面类似的事情。</ p >
</ div>

展开原文

原文

Um, back in the old days I'd use CGI with non-parsed headers (NPH... google it) and $|=1 "when you want your pipes to be piping hot".

You're going to have to do something similar with the PHP side.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐