在后台运行ffmpeg进程
我想使用ffmpeg在php中将视频转换为.flv。目前,我正在执行此操作,但是它会挂起浏览器,直到文件上传完毕。我一直在寻找有关如何在后台运行exec()进程的php文档,同时使用返回的PID更新进程。这是我发现的:
//Run linux command in background and return the PID created by the OSfunction run_in_background($Command, $Priority = 0)
{
if($Priority)
$PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
else
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
return($PID);
}
我还使用一个技巧来跟踪后台任务是否正在使用返回的PID运行:
//Verifies if a process is running in linuxfunction is_process_running($PID)
{
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
我是否想创建一个单独的.php文件,然后从php cli运行以执行以下功能之一?我只需要稍微推动一下即可开始工作,然后我就可以从那里接管它。
谢谢!
回答:
我是否想创建一个单独的.php文件,然后从php cli运行以执行以下功能之一?
这可能是我会这样做的方式:
- PHP网页在数据库中添加了一条记录,指示“此文件必须处理”
- 并向用户显示信息; 诸如“您的文件将很快处理”之类的内容
- 在CLI中,对新插入的文件进行批处理
- 首先,将记录标记为“处理中”
- 做ffmpeg的事
- 将文件标记为“已处理”
- 并且,您可以在网页上向用户显示他的文件处于哪种状态:
- 如果尚未处理
- 如果正在处理
- 或是否已处理-您可以给他链接到新视频文件的链接。
这还有其他一些想法:
- 您的应用程序变大的那一天,您可以:
- 一台“网络服务器”
- 许多“处理服务器”;在您的应用程序中,这是ffmpeg的事情,需要大量的CPU,不能提供网页;因此,能够缩放该部分非常好(这是“锁定”文件的另一种方式,在DB中将其表示为“处理中”:这样,您将没有多个处理服务器尝试处理同一文件)
- 您仅使用Web服务器上的PHP生成网页,这是Web服务器的工作
- 繁重/漫长的处理不是Web服务器的工作!
- 在“处理”部分,您将需要切换到PHP以外的其他地方,这将变得更加容易。
您的“处理脚本”必须每隔几分钟启动一次;如果您使用的是类似Linux的计算机,则可以使用cron。
编辑:看到评论后,更多信息
由于处理部分是通过CLI而不是Apache来完成的,因此您不需要任何“后台”操作:您可以使用shell_exec
,它将在完成工作后将命令的整个输出返回给您的PHP脚本。
。
对于观看网页说“正在处理”的用户,它看起来像是后台处理;从某种意义上说,它将由另一个进程(甚至可能在另一台机器上)完成。
但是,对您来说,它将变得更加简单:
- 一个网页(无“背景”)
- 一个CLI脚本,也没有后台内容。
我想您的处理脚本可能看起来像这样:
// Fetch informations from DB about one file to process// and mark it as "processing"
// Those would be fetched / determined from the data you just fetched from DB
$in_file = 'in-file.avi';
$out_file = 'out-file.avi';
// Launch the ffmpeg processing command (will probably require more options ^^ )
// The PHP script will wait until it's finished :
// No background work
// No need for any kind of polling
$output = shell_exec('ffmpeg ' . escapeshellarg($in_file) . ' ' . escapeshellarg($out_file));
// File has been processed
// Store the "output name" to DB
// Mark the record in DB as "processed"
真的比您最初想象的要容易吗?;-)
不必再担心后台内容了:重要的是,处理脚本会定期从crontab启动。
希望这可以帮助 :-)
以上是 在后台运行ffmpeg进程 的全部内容, 来源链接: utcz.com/qa/434587.html