Php 对大文件使用shell_exec超时进行FFMPEG转换

Php 对大文件使用shell_exec超时进行FFMPEG转换,php,ffmpeg,shell-exec,Php,Ffmpeg,Shell Exec,我正在尝试使用ffmpeg和php将一个大的(40mb)mov文件转换为mp4 但它在服务器上给了我一个504超时错误。我可以在不更改设置时间限制的情况下解决此问题吗 这是我的php代码 shell_exec($this->getFFmpegPath() . ' -i ' . $path . ' -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -preset slower -crf 18 -vf "scale=trunc(in_w/

我正在尝试使用ffmpeg和php将一个大的(40mb)mov文件转换为mp4

但它在服务器上给了我一个504超时错误。我可以在不更改
设置时间限制的情况下解决此问题吗

这是我的php代码

shell_exec($this->getFFmpegPath() . ' -i ' . $path . ' -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -preset slower -crf 18 -vf "scale=trunc(in_w/2)*2:trunc(in_h/2)*2" ' . $convertedPath . '.mp4');

那么,关于如何在没有超时的情况下转换它,有什么想法吗?任何帮助都将不胜感激。

您可能希望在后台运行转换。我发现这可以解决这个问题,但请在这个问题上做更多的调查。然后,您可以允许用户刷新以查看流程是否完成

它可能会提供更好的用户体验(更好地看一个页面加载很长时间)。连接中有很多地方可能会认为是超时:PHP引擎、WebServer、代理、浏览器,这取决于Iras.


另外,你还应该对shell_exec
非常小心。网络上有人滥用它来做任何他们想用你的机器做的事情的几率很高。可能不是你现在使用它的方式(取决于
$path
$convertedPath
来自哪里),但可能在以后的代码更新中,您允许用户指定生成的文件名,例如。

谢谢Paul,我做了一些研究,发现我可以在后台运行该进程,但现在我需要获取后台进程的状态。我自己没有尝试过类似的操作,因此我不知道您可能遇到哪些问题到。链接的问题建议存储PID。由于您可能有多个parralel用户,我可以想象将其存储在会话中可能是一个不错的选择。然后您需要一个显示状态的页面。要检查进程是否仍在运行,可以使用
if(file_存在(“/proc/$PID”)){
正如这个答案所建议的:当作为后台进程启动转换时,您将无法再访问stdout和stderr(并且也无法确定进度信息)。因此,将stdout和stderr写入
$tempdir/$pid.stdout.log
$tempdir/$pid.stderr.log
或类似内容可能是一个好主意。我计划实现此解决方案,我想希望上面提到的内容仍然对您有所帮助。您提到的答案是美国“使用web重定向、AJAX或web套接字定期重新检查转换状态。“上面的备注主要是关于该特定部分。请确保将PID存储在某个位置,并确保您保留对stdout和stderr的访问权限。这是为了能够向用户反馈可能的转换错误,如果您决定让用户访问进度信息(例如,45%已完成),也需要这样做。”.这是否意味着你原来的问题得到了回答?