Как заставить PHP обрабатывать вывод нескольких строк?

#php

#php

Вопрос:

Я борюсь с этим уже целый день… У меня есть команда ОС, которая возвращает несколько строк вывода:

 root@downloader:/var/www/html# /usr/local/bin/sdm120c -a 1 -P N -S 2 -j 20 /dev/ttyUSB0
Voltage: 248.00 V
Current: 16.29 A
Power: 4000.40 W
Active Apparent Power: 4014.28 VA
Reactive Apparent Power: -339.60 VAR
Power Factor: 1.00
Phase Angle: 0.00 Degree
Frequency: 50.00 Hz
Import Active Energy: 22726178 Wh
Export Active Energy: 252806 Wh
Total Active Energy: 22978984 Wh
Import Reactive Energy: 1136648 VARh
Export Reactive Energy: 2343577 VARh
Total Reactive Energy: 3480225 VARh
OK
 

Сейчас я пытаюсь получить этот вывод через Интернет с помощью простого PHP-скрипта, поэтому я делаю:

 <?php
echo (exec('/usr/local/bin/sdm120c -a 1 -P N -S 2 -j 20 /dev/ttyUSB0'));
?>
 

Однако результат всегда «OK», который является последней строкой вывода.

Моей первой идеей было «grep» необходимую информацию в команде ОС и запускать ее несколько раз по мере необходимости, например:

echo (exec('/usr/local/bin/sdm120c -a 1 -P N -S 2 -j 20 /dev/ttyUSB0 | grep -i Power:'));

и было бы достаточно, если бы мне нужна была только одна строка вывода. Проблема в том, что я не могу запускать команду ОС чаще, чем раз в 3 или 4 секунды, поэтому, поскольку мне нужно несколько строк, я не могу использовать эту альтернативу…

Есть идеи, как заставить вывод всех команд ОС отображаться в запросе PHP?

Комментарии:

1. Как описано в документации , добавьте переменную к exec вызову, чтобы результаты возвращались в виде массива.

2. В качестве альтернативы вы можете захотеть взглянуть на оболочку вокруг основных функций, которые немного упрощают обработку команды / вывода. Например, Symfony предоставляет компонент процесса , который вы могли бы использовать

Ответ №1:

Согласно комментариям от @RiggsFolly и @Dave, работает следующее:

 <?php
exec('/usr/local/bin/sdm120c -a 1 -P N -S 2 -j 20 /dev/ttyUSB0', $output);
print_r($output[2]);
print_r($output[4]);
 ?>