2010-12-12 2 views
0

Вот очень простая программа, которая я тестирование наОтображение консоли Ouput в браузере в то время как Perl скрипт продолжает работать

#!/usr/bin/perl 

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

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

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

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

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

print "Script Testing Done\n"; 

Теперь PHP должен вывести выходной скрипт (который будет утешать) каждые возможно 10 секунд или 5 секунд или всякий раз, когда php видит выход на консоли.

У меня есть сотни скриптов perl, и я не могу пойти и изменить этот сценарий и направить вывод в файл, где php/ajax может получать контент и выводить его в браузер.

Благодаря

+1

Подождите, что? У вас есть PHP-скрипты Perl? –

+0

Очень похожий вопрос (с хорошими ответами) здесь: http://stackoverflow.com/questions/1181135/how-can-i-serve-unbuffered-cgi-content-from-apache-2 –

+0

Да, я вызываю скрипт Perl от PHP. – Xomo

ответ

2

Вы, вероятно, хотите proc_open() и flush().

Первый позволяет вам читать/записывать процессы по своему желанию. Последний очищает выходной буфер.

(Edit, добавьте пример кода)

Вот пример PHP-скрипт, который вызывает ваш образец Perl выше (при условии его называют test.pl). Обратите внимание, что из-за механизма буферизации вывода Perl вам нужно указать свой скрипт Perl, чтобы STDOUT неявно скрывался (или «делал это горячим» в Perl-talk). Вы можете сделать это, добавив $|=1 в начало своего сценария Perl.

<?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)\n"; 
     $fromPerl = fread($pipes[1], 1024); // read up to 1k 
     if ($fromPerl) { 
      echo "Perl> {$fromPerl}"; 
     } 
     sleep(2); // do other work instead 
    } 
    proc_close($proc); 
} 

Вот результат:

$ 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 
+0

Hi Scoates, Можете ли вы просто предоставить некоторый код, как я могу использовать эти две функции? – Xomo

+0

Я добавил пример скрипта и его вывод. – scoates

+0

Спасибо, много сот ... Этот пример Удивительный. Я действительно ценю это. – Xomo

0

Ум, в прежние времена я бы использовал CGI с непереработанными заголовками (NPH ... google it) и $|=1 «когда вы хотите, чтобы ваши трубы были горячими».

Вам нужно будет сделать что-то подобное с PHP-стороной.

Смежные вопросы