AJAX触发PHP执行FFMPEG转码上传YouTube,跳转后进程中断如何处理?
这个问题我之前在项目里也碰到过!核心痛点就是PHP默认会跟着客户端连接断开而终止进程,所以得想办法让任务脱离当前请求的生命周期。给你几个靠谱的方案,从快速实现到生产级部署的都有:
在你的AJAX触发的PHP脚本开头加上这两行配置,就能让PHP进程无视客户端断开的信号,继续跑完任务:
ignore_user_abort(true); // 告诉PHP不要因为客户端断开就终止脚本 set_time_limit(0); // 取消脚本执行时间限制(也可以设一个足够覆盖任务时长的数值,比如3600)
之后正常写你的FFMPEG转码和YouTube上传逻辑就行。用户跳转页面后,这个PHP进程会在后台继续执行直到任务完成。
⚠️ 注意:这种方法还是依赖Web服务器的进程资源,如果服务器重启或者进程被回收,任务可能会中断。适合快速验证或者任务时长较短的场景。
把转码+上传的核心逻辑单独抽成一个PHP脚本,比如video_processor.php,然后在AJAX处理脚本里,用系统命令把这个脚本丢到系统后台运行,彻底脱离Web请求的生命周期:
首先是AJAX触发的脚本:
// 获取独立脚本的绝对路径 $processorScript = realpath(__DIR__ . '/video_processor.php'); // 用nohup让脚本脱离终端,&放到后台,输出重定向到/dev/null避免占用资源 shell_exec("nohup php $processorScript > /dev/null 2>&1 &"); // 立刻返回响应,让前端执行页面跳转 echo json_encode(['status' => 'task_started']); exit;
然后是独立的video_processor.php脚本:
// 同样取消时间限制 set_time_limit(0); // 执行FFMPEG转码命令 shell_exec("ffmpeg -i /path/to/input.mp4 -c:v libx264 /path/to/output.mp4"); // 调用YouTube v3 API上传视频 // ... 这里写你的上传逻辑代码 ...
这种方案的好处是,任务完全由操作系统管理,和Web服务器进程无关,就算Web服务重启,只要系统没关机,任务就能继续跑。而且不需要修改Web服务器的PHP配置,稳定性更高。
⚠️ 注意:要确保PHP脚本有足够的文件操作权限,另外可以用which php命令获取PHP的绝对路径,替换掉命令里的php,避免环境变量问题。
如果你的项目是长期维护的,或者任务量较大,推荐用消息队列解耦任务触发和执行流程:
- AJAX触发的PHP脚本:只负责把任务信息(比如视频路径、YouTube上传参数)放到消息队列里,然后立刻返回响应让用户跳转。
- 单独编写一个Worker脚本,用Supervisor或systemd管理,让它一直运行,监听队列里的任务,一旦有任务就执行转码和上传。
举个Redis队列的简单示例:
AJAX触发脚本(入队):
// 连接Redis $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // 序列化任务数据并加入队列 $taskData = json_encode([ 'input_video' => '/path/to/input.mp4', 'output_video' => '/path/to/output.mp4', 'youtube_config' => [/* 你的上传参数,比如API密钥、视频标题等 */] ]); $redis->lPush('video_process_queue', $taskData); // 返回响应 echo json_encode(['status' => 'task_queued']); exit;
Worker脚本(消费队列):
set_time_limit(0); $redis = new Redis(); $redis->connect('127.0.0.1', 6379); while (true) { // 阻塞式取任务,避免空循环浪费CPU $taskData = $redis->brPop('video_process_queue', 0); if ($taskData) { $task = json_decode($taskData[1], true); // 执行FFMPEG转码 shell_exec("ffmpeg -i {$task['input_video']} -c:v libx264 {$task['output_video']}"); // 上传到YouTube // ... 你的上传逻辑 ... } // 短休眠减少CPU占用 usleep(100000); }
然后用Supervisor工具管理这个Worker脚本,确保它意外退出后能自动重启。这种方案支持任务监控、失败重试、横向扩展Worker数量,是生产环境的最优解。
内容的提问来源于stack exchange,提问作者Emmanuel Fernandez

