Чтение из стандартного потока вывода программы

Задача
Необходимо прочитать стандартный поток вывода программы; например, требуется вывод системной утилиты, такой как route(8), предоставляющей сетевую информацию.

Решение
Для того чтобы прочитать все содержимое программного вывода, применяется оператор обратного апострофа ('):

$routing_table = `/sbin/route`;


Чтобы читать вывод частями, откройте канал к функции popen():

$ph = popen('/sbin/route','r') or die($php_errormsg);
while (! feof($ph)) {
$s = fgets($ph,1048576) or die($php_errormsg);
}
pclose($ph) or die($php_errormsg);


Обсуждение
Оператор обратного апострофа (который недоступен в безопасном режиме) выполняет программу и возвращает ее вывод одной строкой. На машине под управлением Linux с оперативной памятью объемом 448Мбайт следующая команда:

$s = `/usr/bin/free`;


помещает в переменную $s следующий многострочный вывод:

total used free shared buffers cached
Mem: 448620 446384 2236 0 68568 163040
-/+ buffers/cache: 214776 233844
Swap: 136512 0 136512


Если программа генерирует большой вывод, то с точки зрения эффективности распределения памяти следует читать из канала по одной строке за раз. Если вы передаете форматированную информацию броузеру, основываясь на выводе канала, то можно передавать данные по мере их поступления. Следующий пример выводит информацию о недавних регистрациях в системе UNIX, отформатированную в виде HTML-
таблицы. В нем используется команда /usr/bin/last:

// печатаем заголовок таблицы
print<<<_HTML_
<table>
<tr>
<td>user</td><td>login port</td><td>login from</td><td>login time</td>
<td>time spent logged in</td>
</tr>
_HTML_;
// открываем канал к /usr/bin/last
$ph = popen('/usr/bin/last','r') or die($php_errormsg);
while (! feof($ph)) {
$line = fgets($ph,80) or die($php_errormsg);
// не обрабатываем пустые строки или информационную строку в концеif (trim($line) && (! preg_match('/^wtmp begins/',$line))) {
$user = trim(substr($line,0,8));
$port = trim(substr($line,9,12));
$host = trim(substr($line,22,16));
$date = trim(substr($line,38,25));
$elapsed = trim(substr($line,63,10),' ()');
if ('logged in' == $elapsed) {
$elapsed = 'still logged in';
$date = substr_replace($date,'',-5);
}
print "<tr><td>$user</td><td>$port</td><td>$host</td>";
print "<td>$date</td><td>$elapsed</td></tr>\n";
}
}
pclose($ph) or die($php_errormsg);
print '</table>';
Теги:
поток вывода
Добавлено: 22 Июля 2018 18:33:09 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...