Вы, вероятно, хотите 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