此类场景中的常见解决方案是将转换过程卸载到后台脚本(例如,由cron定期触发的作业)。这可以避免长时间运行的进程超时或外部命令行进程无法正确返回的问题。
网页只是将请求放入队列(例如在db表中)并保存文件。
然后,后台服务将从队列中选择下一个项目,对其进行处理,并将其标记为完成。
然后你必须考虑如何通知用户。您可以给他们发送电子邮件,或者有一个状态页面,他们可以检查他们的工作并下载任何已准备好的文件,或者两者都有,或者您选择的其他一些过程。也许您可以允许用户指定他们希望如何获知。
如果要在后台从PHP启动此命令,可以按此模式运行非阻塞进程:
if(is_resource($proc = proc_open($cmd, [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $pipes))) { stream_set_blocking($pipes[1], false); stream_set_blocking($pipes[2], false);
在Linux系统上,您可以使用前置命令启动命令 nohup ,例如
nohup
$cmd = 'nohup "/dir/to/ffmpeg" -f image2 -i "' . $imgDir . '" -r 12 -s 610x489 /dir/to/out.avi'
使用后 nohup 您甚至可以退出启动新流程的流程。它将与父进程分离。