2010-11-09 139 views
0

我试图在后台使用PHP执行一个命令,所以Web应用程序可以继续加载,但目前为止没有运气。使用PHP在后台运行一个管道外壳命令

,该命令对直播流应用程序,因此涉及以下内容:

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

我能坚持以上的脚本,并在与&庆典背景罚款执行它,但这并不在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(); 
} 

回答

0

如果您需要流进行的操作的结果,使用系统或中继方法,或者使用POPEN或proc_open有对过程的输入和输出完全控制。

通常,由您的Web服务器触发的PHP脚本意味着生成一个页面并退出。他们不是做视频编码等后台任务的最佳场所,你的网络服务器会限制程序执行时间,并且很难从你的浏览器获取状态信息(它会挂起)。

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

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

+0

谢谢扎克。目的不是阻止这一点,我想我试图实现“守护进程”功能,但可能无法实现。但要澄清,我不想流出这个行动的结果;该命令字符串在磁盘上创建可通过HTML-5元素访问的文件(PHP程序将继续创建)。我会看看一个守护进程的方法,但希望更简单的方法来缓解现场部署。 – 2010-11-09 23:48:40