在后台运行 ffmpeg 进程
我想在 php 中使用 ffmpeg 将视频转换为 .flv。 目前我可以正常工作,但它会挂起浏览器,直到文件上传并完成。 我一直在查看 php 文档,了解如何在后台运行 exec() 进程,同时使用返回的 PID 更新进程。 这是我发现的:
//Run linux command in background and return the PID created by the OS
function 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 linux
function is_process_running($PID)
{
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
我是否想创建一个单独的 .php 文件,然后从 php cli 运行该文件来执行这些函数之一? 我只需要一点点推动就可以让它工作,然后我就可以从那里开始。
谢谢!
I am wanting to use ffmpeg to convert video to .flv in php. Currently I have this working, but it hangs the browser until the file is uploaded and is finished. I have been looking at the php docs on how to run an exec() process in the background, while updating the process using the returned PID. Here is what I found:
//Run linux command in background and return the PID created by the OS
function 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);
}
There is also a trick which I use to track if the background task is running using the returned PID :
//Verifies if a process is running in linux
function is_process_running($PID)
{
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
Am I suppose to create a separate .php file which then runs from the php cli to execute one of these functions? I just need a little nudge in getting this working and then I can take it from there.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这可能是我会这样做的方式:
这里有一些其他的想法:
您的“处理脚本”必须每隔几分钟启动一次; 如果你使用的是类似 Linux 的机器,你可以使用 cron 来实现。
编辑:看到评论后,请提供更多信息
由于处理部分是从 CLI 完成的,而不是从 Apache 完成的,因此您不需要任何类型的“后台”操作:您可以只使用
shell_exec
,当它完成时,它将把命令的整个输出返回给你的 PHP 脚本工作。对于观看网页的用户来说,说“正在处理”,这看起来像是后台处理; 并且,在某种程度上,它会是的,因为处理将由另一个进程(甚至可能在另一台机器上)完成。
但是,对您来说,它会简单得多:
我想您的处理脚本可能看起来像这样:
真的比您最初想象的要容易,不是吗? ;-)
不用再担心后台的事情了:唯一重要的是处理脚本会从 crontab 定期启动。
希望这可以帮助 :-)
This is probably the way I would do it :
Here's a couple of other thoughts :
Your "processing script" would have to be launch every couple of minutes ; you can use cron for that, if you are on a Linux-like machine.
Edit : a bit more informations, after seeing the comment
As the processing part is done from CLI, and not from Apache, you don't need anykind of "background" manipulations : you can just use
shell_exec
, which will return the whole ouput of the command to your PHP script when it's finished doing it's job.For the user watching the web page saying "processing", it will seem like background processing ; and, in a way, it'll be, as the processing will be done by another processus (maybe even on another machine).
But, for you, it'll be much simpler :
Your processing script could look like something like this, I suppose :
Really easier than what you first thought, isn't it ? ;-)
Just don't worry about the background stuff anymore : only thing important is that the processing script is launched regularly, from crontab.
Hope this helps :-)
您不需要编写单独的 php 脚本来执行此操作(尽管如果您实现某种排队系统,您可能需要稍后编写)。
你快到了。 唯一的问题是,shell_exec() 调用会阻塞以等待 shell 的返回。 如果您将 shell 中命令的所有输出重定向到删除文件或 /dev/null 并将任务置于后台(使用 & 运算符),则可以避免这种情况。
所以你的代码将变成:
不幸的是,我认为没有任何方法可以检索 PID。
You don't need to write a separate php script to do this (Though you may want to later if you implement some sort of queuing system).
You're almost there. The only problem is, the shell_exec() call blocks to wait for the return of the shell. You can avoid this if you redirect all output from the command in the shell to wither a file or /dev/null and background the task (with the & operator).
So your code would become:
I don't think there is any way to retrieve the PID, unfortunately.