Composer没有渲染队列概念,它仅是PHP依赖管理器;所谓“渲染队列”实为混淆了ffmpeg、任务调度库等真正执行渲染的工具链。

Composer 没有“渲染队列”这个概念,也根本不参与任何图形、视频或动画的渲染过程——它只是 PHP 的依赖管理器,不执行帧生成、编码、合成等任何渲染逻辑。
为什么你会看到“Composer 渲染队列”这种说法
这是典型的工具链混淆:把真正干活的系统命令(如 ffmpeg)、任务调度库(如 yii2-queue)或前端渲染管线(如 EffectComposer)误记为 Composer 功能。Composer 只可能做三件事:
- 通过
composer require php-ffmpeg/php-ffmpeg下载一个 PHP 封装类 - 在
post-install-cmd里触发一段自定义 PHP 脚本(比如初始化 Redis 队列) - 用
scripts字段声明一个 CLI 命令别名(如"render:queue": "php bin/run-queue.php")
它本身不会启动进程、不会调用 exec()、不会读取 PNG 序列、也不会写 MP4 文件。
多项目后台导出的可行路径
若你真要从多个 PHP 项目中批量导出视频/动画结果,必须绕过 Composer 的边界,构建独立调度层:
- 每个项目提供标准输入接口:例如监听
/var/www/project-a/jobs/下的 JSON 配置,含输入路径、分辨率、帧率等字段 - 用统一的守护进程(如
supervisor管理的 PHP worker)轮询所有项目 job 目录,按优先级入 Redis 队列 - worker 进程内实例化
PHPFFMpeg,但必须显式设置:'timeout' => 3600、'ffmpeg.binaries' => '/usr/local/bin/ffmpeg'、'ffprobe.binaries' => '/usr/local/bin/ffprobe' - 输出路径必须为绝对路径且由 worker 进程创建(
mkdir -p /output/project-a/20260523/),不能依赖vendor/目录下的相对路径
注意:php-ffmpeg 不支持并发渲染同一台机器上的多个视频——它默认共享 /tmp 下的帧缓存目录,会相互覆盖。必须为每个任务指定独立 temp_directory。
最容易被忽略的硬性限制
不是配置写得不对,而是环境根本没准备好:
-
exec()或shell_exec()被禁用 → 查disable_functions输出,不是加个composer require就能绕过 - CI/CD 容器里没装
ffmpeg→ffmpeg -version必须在容器内直接可执行,不能只靠 PHP 包“假装存在” - PHP 进程用户对输出目录无写权限 →
chown -R www-data:www-data /output比改 PHP 代码更有效 - 帧序列命名不连续(如缺
frame_042.png)→addImage()会静默跳过,最终视频卡顿,需提前校验文件存在性
真正卡住的地方,从来不是 composer.json 怎么写,而是 ffmpeg 进程是否真的跑起来了、有没有 stderr 日志、临时文件目录是否被 SELinux 锁死。


















