FrankenPHP不管理Symfony Messenger消费进程,需独立运行php bin/console messenger:consume;其worker模式仅优化HTTP请求,对CLI队列处理无加速作用,环境变量、信号传递、日志配置等须单独适配。

FrankenPHP 本身不接管 Symfony Messenger 的消费进程,php bin/console messenger:consume 仍需独立运行 —— 这意味着队列异常处理逻辑和传统 FPM 部署完全一致,但启动方式、环境隔离和信号传递容易出问题。
FrankenPHP 不负责消费,messenger:consume 必须单独启停
FrankenPHP 只处理 HTTP 请求生命周期(含 worker 模式下的常驻 PHP 应用),它不会自动拉起或管理 messenger:consume 进程。你不能指望 frankenphp serve 启动后消息就自动被消费。
- 必须手动或通过进程管理器(如 systemd、supervisord)启动
php bin/console messenger:consume async --time-limit=3600 - 若用
--no-reset模式,要确保每次消费前容器/服务已初始化完成(例如 Doctrine EntityManager 未因长连接失效) - FrankenPHP 的 worker 模式对 HTTP 请求有效,但对 CLI 命令无影响 ——
messenger:consume仍是标准 CLI 进程,加载完整框架、走完整生命周期
信号中断导致消费者静默退出,尤其在 Docker 中
Docker 容器默认只转发 SIGTERM 给 PID 1 进程,而 messenger:consume 在前台运行时会捕获 SIGINT/SIGTERM 并优雅停止。但如果它不是 PID 1,信号可能根本收不到。
- 在 Dockerfile 中,避免用
sh -c "php bin/console messenger:consume..."启动 ——sh成为 PID 1,信号被它吞掉,消费者收不到 - 改用
exec php bin/console messenger:consume...,让 PHP 进程直接成为 PID 1 - 使用
--stop-when-empty或--time-limit配合健康检查,避免无限挂起;不要依赖无超时的纯--limit
环境变量与配置错位:worker 模式 vs CLI 环境不一致
Symfony 在 FrankenPHP worker 模式下会复用已初始化的容器,但 messenger:consume 是全新 CLI 进程,它读取的是 .env 或系统环境变量,而非 worker 进程里已加载的配置缓存。
立即学习“PHP免费学习笔记(深入)”;
- 常见表现:
messenger:consume连不上 Redis,但 Web 请求能正常发消息 —— 因为 Web 端用了 FrankenPHP worker 缓存的 DSN,CLI 端却读错了MESSENGER_TRANSPORT_DSN值 - 确认方式:在 consumer 启动前加一行
var_dump($_ENV['MESSENGER_TRANSPORT_DSN'] ?? 'not set'); - 修复动作:统一通过
.env设置,且确保 Dockerenv_file或environment覆盖项与 Web 层一致;禁用php bin/console cache:warmup时的环境混淆(CLI 缓存 ≠ worker 缓存)
异常日志丢失:Monolog 的 console channel 默认不写文件
Symfony 默认把 console 命令的日志输出到 php://stderr,不落地到 var/log/prod.log 或 var/log/dev.log —— 导致消费者崩溃时,你查不到任何堆栈。
- 检查
config/packages/prod/monolog.yaml是否有consolehandler,且没被channels: ['!console']排除 - 显式启用 console 日志落盘:添加 handler 如
console_file,type 设为stream,path 指向php://stderr或独立文件(如%kernel.logs_dir%/console.log) - 启动 consumer 时加
--verbose参数,可强制输出 debug 级别异常,方便快速定位序列化失败等静默错误
最易忽略的一点:FrankenPHP 的 worker 模式只加速 HTTP 请求,对 messenger:consume 的性能毫无帮助 —— 它该慢还是慢,该崩还是崩,别误以为“常驻内存”能顺带托管队列。



















