PHP shell_exec выполнение консольной команды

679
19 декабря 2016, 19:30

Пытаюсь написать выполнение консольной команды после нажатия на кнопку. Вот что получилось

<tr class="method1">
        <th style="color: #831623" scope="row">record</th>
        <td>
            <button id="recordStart" name="record">start</button>
            <?php
                $output = shell_exec($_POST['ffmpeg -i udp://@239.239.2.1:1234 -vcodec copy -an -r 25 -t 20 -pix_fmt yuv420p -f mp4 video_for_test.mp4']);
            ?>
        </td>
    </tr>

к сожалению это не работает. В чем причина, так и не могу понять

Answer 1

PHP, скорее всего, отрабатывает и возвращает результат выполнения команды. Но на этом всё заканчивается, хотя ffmpeg продолжает работать. Нужно зациклить чтение шелла, примерно так (Найдено на ENSO):

<?php
function liveExecuteCommand($cmd)
{
    while (@ ob_end_flush()); // end all output buffers if any
    $proc = popen("$cmd 2>&1 ; echo Exit status : $?", 'r');
    $live_output     = "";
    $complete_output = "";
    while (!feof($proc))
    {
        $live_output     = fread($proc, 4096);
        $complete_output = $complete_output . $live_output;
        echo "$live_output";
        @ flush();
    }
    pclose($proc);
    // get exit status
    preg_match('/[0-9]+$/', $complete_output, $matches);
    // return exit status and intended output
    return array (
                    'exit_status'  => $matches[0],
                    'output'       => str_replace("Exit status : " . $matches[0], '', $complete_output)
                 );
}
?>

Пример использования:

$result = liveExecuteCommand('ls -la');
if($result['exit_status'] === "0"){
   // do something if command execution succeeds
} else {
    // do something on failure
}

Оригинал: http://stackoverflow.com/questions/20107147/php-reading-shell-exec-live-output

Answer 2

Я проверял так:

<?php
$cmd = '/usr/bin/ffmpeg -i /home/drop.avi -r 10 -s 100x200 /home/apache/out.avi'; - В переменную добавляем команду для exec. Взять файл drop и сконвертировать в out.avi
$out=exec($cmd, $output, $value); - Собственно, выполняем команду.
var_dump($output); - Смотрим что исполненая команда дала на выход.
var_dump($value); - Статус завершения - это результат выполнения приложения, т.е. с каким кодом он завершил работу. Если 0 - то всё хорошо. Если НЕ 0 - значит завершился с ошибкой.
var_dump($cmd); - На всякий случай выводим использованную команду.
exit;
?>

При успешном выполнении должны получить что-то вроде :

array(0) { } int(0) string(72) "/usr/bin/ffmpeg -i /home/drop.avi -r 10 -s 100x200 /home/apache/out2.avi"
Answer 3

Нашел то что мне нужно.

я сделал это немного проще чем ваше решение, единственное что еще не подключил, это то, что выдает ffmpeg "2>&1"

<form method="post">
   <input type="submit" name="recordStart" value="start" />
<?php
   if(isset($_POST['recordStart'])){
   $output = shell_exec('ffmpeg -i <input_файл> -vcodec copy -an -t <время_записи> -r <FPS> -pix_fmt yuv420p -f mp4 <output_файл>.mp4');
   }
?>
</form>

Единственное что не сделано, 2>&1 это то что выдает FFMPEG

READ ALSO
COOKIE хранятся в пределах одной папки

COOKIE хранятся в пределах одной папки

Такая проблема: COOKIE почему-то хранятся только в пределах одной папкиНапример, на сайте перешел в папку site

153
Переадресация и разные домены

Переадресация и разные домены

Пользователь заходит на главный сайт (xxxru), на нем он регистрируется и открывает виртуальную компанию - после регистрации ему должен выделяться...

178