Вы, вероятно, хотите 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
Подождите, что? У вас есть PHP-скрипты Perl? –
Очень похожий вопрос (с хорошими ответами) здесь: http://stackoverflow.com/questions/1181135/how-can-i-serve-unbuffered-cgi-content-from-apache-2 –
Да, я вызываю скрипт Perl от PHP. – Xomo