Запустите команду piped shell в фоновом режиме, используя PHP - PullRequest
0 голосов
/ 10 ноября 2010

Я пытаюсь выполнить команду в фоновом режиме, используя PHP, чтобы веб-приложение могло продолжать загружаться, но пока безуспешно.

Команда предназначена для приложения потокового вещания, поэтому включает следующее:

<stream pre-process> | ffmpeg <options> | <stream segmenter>

Я могу вставить вышеприведенное в скрипт и выполнить его в фоновом режиме в bash с помощью &, но в PHP это не работает. Я также пытался использовать nohup и "nohup & echo $!", Но не повезло.

Я также отправляю все stderr в / dev / null и могу проверить в журналах apache, что при выполнении команды не генерируется вывод (но он выполняется).

Некоторые примеры кода ниже ... то, что я имею после этого кода, не выполняется до тех пор, пока это не завершится, что долгое время.

function streamVid ($mid, $width, $height, $br) {
    $cdir = "./temp";
    $zmstrm = "zmstreamer -m ".$mid." 2> /dev/null";
    $seg = "segmenter - 3 ".$cdir."/sample_".$mid." ".$cdir."/stream_".$mid.".m3u8 ./ 2>/dev/null";
    $ffparms = "-f mpegts -analyzeduration 0 -acodec copy -s ".$width."x".$height."   -vcodec libx264 -b ".$br." -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate ".$br." -bufsize ".$br." -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -analyzeduration 0 -async 2 - 2> /dev/null";
    $url = $zmstrm . " | ffmpeg -t 10 -analyzeduration 0 -i - ". $ffparms . " | " . $seg;
    shell_exec("nohup ". $url." & echo $!");       
    ob_flush();
    flush();
}

1 Ответ

0 голосов
/ 10 ноября 2010

Если вам нужно вывести результат операции, используйте системные или промежуточные методы или popen или proc_open, чтобы получить полный контроль над вводом и выводом процесса.

Как правило, PHP-скрипты, которые запускаются вашим веб-сервером, предназначены для генерации страницы и выхода. Это не лучшее место для выполнения фоновых задач, таких как кодирование видео, ваш веб-сервер будет накладывать ограничение на время выполнения программ, и будет трудно получить информацию о состоянии из вашего браузера (он будет зависать).

Лучше всего создать отдельный процесс-демон на таком языке, как Python (или PHP), который будет работать на вашем компьютере. Когда ваши веб-скрипты должны перекодировать видео, они могут поместить необходимую информацию в базу данных или файл, который может быть опрошен процессом демона. Процесс-демон также может обновить базу данных информацией о состоянии.

В целом, ваши веб-страницы должны быть настолько «неблокирующими», насколько это возможно, то есть, если что-то займет больше секунды или двух, сделайте это в фоновом режиме и создайте страницы на своем сайте, чтобы пользователь может просматривать статус операций и манипулировать им.

...