Отображение выхода консоли в браузере, пока Perl Script еще работает - PullRequest
0 голосов
/ 13 декабря 2010

Вот очень простая программа, которую я тестирую на

#!/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 может получить содержимое и вывести его в браузер.Спасибо

Ответы [ 3 ]

2 голосов
/ 13 декабря 2010

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

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

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

Вот пример PHP-скрипта, который вызывает ваш пример Perl выше (предполагается, что он называется test.pl). Обратите внимание, что из-за механизма буферизации вывода в Perl, вы должны указать скрипту Perl, чтобы STDOUT неявно сбрасывался (или «делал его горячим» в Perl-говорящем). Вы можете сделать это, добавив $|=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 голосов
/ 14 декабря 2010

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

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

0 голосов
/ 13 декабря 2010

Возможно, я не туда лаю, но неужели вы страдаете от буферизации ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...