exec не возвращает то, что должно быть выведено командой

exec не возвращает то, что должно быть выведено командой

Есть такая команда в линуксе mmsrip - позволяет записывать потоковое видео вещаемое по mms-протоколу
mmsrip -t <поток> - проверяет доступность потока. Например:

PHP:
$ mmsrip -t mms://tv.gldn.net/rbc
mmsrip (MMS Ripper) version 0.7.0
Stream 'mms://tv.gldn.net/rbc' is available.
Видим что команда отработала, выдала результат.
PHP:
$comand = 'mmsrip -t ' . escapeshellarg('mms://tv.gldn.net/rbc');
echo $comand, '<br />';
exec($comand, $output, $status);
var_dump($status, $output);
Выводит:
mmsrip -t 'mms://tv.gldn.net/rbc'
int 0
array empty

Т.е. корректную команду, которую если засунуть в шелл, то нормально отработает, статус - программа отработала нормально, и пустой массив - набор строк попавших в выходной поток. А там не должно быть пусто. Если вместо $comand поставить ls, то в $output окажется список директорий.
Кто нить знает в чём дело ?
 
Dl
Честно говоря не знаю, но думаю что да... ls же работает.
MiRacLe
Не, не в этом дело точно
pilot911
Собираемся делать сайт по вещанию тв... надо собрать статистику. В конце концов криминального в этом ничего нету, кроме настораживающего названия программы ))

Вообщем я почти что понял в чём проблема - в массиве $outputs ничего нету. А то что там должно быть лежит в /var/log/httpd/error_log. Т.е. видимо mmsrip выводит результат работы в поток ошибок, а не в выходной поток. А вконсоли выходной и стандартный - это одно и тоже - вывод на экран, а при запуске через апач - вывод естественно оказывается в error_log.
Как бы это исправить никто не знает ?
 
x-yuri
Да, получилось, спасибо.
PHP:
$descriptorspec = array(
    0 => array('pipe', 'r'),                    // stdin
    1 => array('pipe', 'w'),                    // stdout
//    2 => array('file', './responces.txt', 'a'), // stderr
    2 => array('pipe', 'w')                     // stderr
);

$comand = 'mmsrip -t ' . escapeshellarg('mms://tv.gldn.net/rbc');
$process = proc_open($comand, $descriptorspec, $pipes);
$error = stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($process);
В $error оказывается нужный мне вывод. А если в $descriptorspec выбрать 2 => array('file', './responces.txt', 'a'), то весь вывод окажется в соответствующем файле.

MiRacLe
Поздно... ))
Но всё равно спсибо.
 

x-yuri

Новичок
Вася Патриков а почему не закрываешь все pipe'ы? тебя не смущает надпись в примере мана
PHP:
    // It is important that you close any pipes before calling
    // proc_close in order to avoid a deadlock
правда не знаю из-за чего там deadlock может возникнуть

а вообще я бы переделал в соответствии с советом MiRacLe - проще и нюансов меньше
 

x-yuri

Новичок
а так как ты написал раньше я и сделал как ты советовал, а не как MiRacle
да, но MiRacLe предложил вариант попроще, сравни
PHP:
$cmd = 'mmsrip -t ' . escapeshellarg('mms://tv.gldn.net/rbc').' 2>&1';
$error = shell_exec($cmd)
 
Сверху