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

Задача
Необходимо прочитать стандартный поток вывода программы; например, требуется вывод системной утилиты, такой как 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_


_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 "";
print "\n";
}
}
pclose($ph) or die($php_errormsg);
print '
userlogin portlogin fromlogin time time spent logged in
$user$port$host$date$elapsed
';

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Блокировка файла
Выбор случайной строки из файла
Запись в несколько файловых дескрипторов одновременно
Запись в стандартный поток вывода
Непосредственная модификация файла без временной копии

Вернуться в раздел: PHP / 18. Файлы