使用PHP在后台运行管道shell命令

时间:2010-11-09 23:07:53

标签: php ffmpeg video-streaming

我正在尝试使用PHP在后台执行命令,因此Web应用程序可以继续加载,但到目前为止还没有运气。

该命令适用于实时流应用程序,因此涉及以下内容:

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

我可以将上面的内容放在脚本中并在bash中使用&amp;在后台执行它,但这在PHP中不起作用。我之前也试过使用nohup,并且“nohup&amp; 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 :(得分:0)

如果您需要流出操作的结果,请使用system或passthru方法,或使用popen或proc_open来完全控制流程的输入和输出。

通常,由Web服务器触发的PHP脚本用于生成页面并退出。它们不是执行视频编码等后台任务的最佳位置,您的Web服务器将限制程序执行时间,并且很难从浏览器获取状态信息(它似乎挂起)。

最好的办法是使用Python(或PHP)等语言创建一个单独的守护程序进程,该程序将在您的计算机上运行。当您的Web脚本需要对视频进行转码时,它们可以将必要的信息放在可由守护进程轮询的数据库或文件中。守护进程还可以使用状态信息更新数据库。

一般情况下,您的网络服务页面应尽可能“无阻塞”,这意味着如果某些内容需要花费一两秒钟的时间,请在后台执行,并在您的网站上创建页面以允许用户查看操作状态并进行操作。