Как читать построчно в system () вывод с помощью переполнения стека

Вот ситуация: у меня есть Unix-программа, которая выводит несколько строк и не прерывается, так как постоянно слушает. Теперь я хотел бы вывести строки в сценарии PHP. Я использовал функцию system (), но она блокировала выполнение остальной части кода, поскольку программа unix не завершала работу.
Я думаю о возможности вывода строки после вывода строки программой unix в консоли.
Как бы я этого достиг?
Спасибо.

3

Решение

Вот пример сценария, который поможет вам:

 $cmd='/bin/ls -la';
$gs="\n"; // this is the delimiter of each line. use "\r\n" in case of windows ...
$pipesDescr=array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", "/tmp/error.log", "a"), );
$p=proc_open($cmd, $pipesDescr, $pipes);
if ($p)
{
stream_set_blocking($pipes[0],0);
stream_set_blocking($pipes[1],0);
$work=true; $buffer=''; $mode='idle'; $command=''; $idle=0;
while ($work)
{
if ($mode=='idle')
{
if ($command<>'')
{
fwrite($pipes[0],$command."\n");
$command='';
$idle=0;
$speed=500; // microseconds!
}
else
{
$speed=100000; // microseconds !
}
}
$s=fread($pipes[1],1024);
if ($s<>'')
{
$mode='action';
$buffer.=$s;
while (strstr($buffer,$gs))
{
$ex=explode($gs,$buffer,2);
{
$buffer=@$ex[1]; $line=@$ex[0];
// here you can process the line with something ...
print($line."<br/>\n");
//
}
}
$speed=500;
$idle=0;
}
else
{
if (@$idle<1000)
{
$idle++; // did not idled for too long, let's still watch intensely for new data
}
else
{
$speed=100000; // it's been idle for a while, let's not overload the CPU for nothing ...
$mode='idle';
}
}
$status=proc_get_status($p);
if (!$status["running"]) {$work=false;} // if the program has quited, we should do so as well ...
} // end of $work loop
proc_close($p);
}

Этот пример использует proc_open и продолжает работать до тех пор, пока ваш процесс не завершится или пока вы не решите выйти. (в этом случае вы должны установить $ work в false …)

1

Другие решения

Хорошее решение — использовать proc_open (), потому что вы можете работать со всеми каналами.
Хороший подход демонстрируется здесь: http://codehackit.blogspot.be/2012/04/automating-command-line-scripts-in-php.html

Я думаю о возможности вывода строки один раз в
строка выводится программой unix в консоли.

Легкое предложение — сложная проблема.
Это может включать мониторинг выходного буфера или выходного файла журнала на предмет изменений, а затем реагировать на это. Событие связано. Попробуйте поработать с $proc->on() обнаружить вещи в вашем выходном буфере, чтобы вызвать обратный вызов.

Реферирование: Правильное выполнение оболочки в PHP & https://stackoverflow.com/a/1533818/1163786

1

По вопросам рекламы [email protected]