frankenphp 1.4 worker 模式需结构化隔离:每个任务独立进程、显式--addr端口(如:8081)、绝对路径--script、systemd/supervisor托管、敏感配置按需解密、数据库启用持久连接,端口仅内网使用,不代理至caddy。

FrankenPHP 1.4 的 Worker 模式在生产环境不是“开个进程就行”,而是需要结构化隔离、端口显式管理、配置安全注入和生命周期可控的一整套规范。核心原则是:每个后台任务一个独立 worker 进程,全部由 systemd 或 supervisor 托管,绝不共用脚本或端口,也不依赖运行时动态加载。
Worker 实例必须独立启动、独立监听
FrankenPHP 不支持单进程多 worker 脚本。每个长期任务(如队列消费、邮件推送、WebSocket 后端)都需单独的 frankenphp-worker 进程:
- 每个实例必须传 --addr :端口号,例如
:8081、:8082;漏掉冒号(如写成8081)会直接报错 -
--script 必须是绝对路径,如
/var/www/app/queue.php;相对路径会导致failed to open stream - 多个实例之间端口不能冲突,否则第二个会因
address already in use立即退出 - 这些端口仅用于内部调用或调试,禁止开放到公网防火墙;对外服务统一走 Caddy 的 80/443
必须用 systemd 或 supervisor 管理生命周期
不能用 nohup ./frankenphp-worker & 或简单 shell 脚本启停:
- 为每个任务建独立 service 文件,例如
frankenphp-queue.service和frankenphp-notifier.service - service 中明确写死
--addr和--script,避免重启后行为漂移 - 配置资源限制,如
MemoryMax=256M、Restart=on-failure、RestartSec=5 - 日志统一交由
journalctl -u frankenphp-queue查看,不写本地文件
敏感配置不得硬编码或顶层加载
Worker 进程常驻内存,配置一旦加载就跨请求残留:
- 禁止在
worker.php顶层写$db_pass = getenv('DB_PASSWORD') - 应封装为服务类或闭包,在每次处理逻辑前按需读取并解密(如从 HashiCorp Vault 或加密 env 文件中获取)
- 数据库连接必须启用持久化(
PDO::ATTR_PERSISTENT => true),同时禁用框架自动 close 行为 - 确保
.env不被打包进二进制:构建前删掉或设APP_ENV=prod并清空 dev 配置
Caddyfile 中不代理 worker 端口
常见误区:以为可以把 api.example.com 反向代理到 :8081。这是错误的:
- frankenphp-worker 不处理 HTTP 请求,它只是常驻 PHP 进程,监听事件、执行业务逻辑
- Caddy 的
php_server处理 Web 流量;worker块只用于声明后台任务入口,不参与路由分发 - 若需多域名 Web 服务(如
app1.example.com和app2.example.com),应使用多个server块 + 共享同一个php_server - Worker 实例间通信必须走外部中间件(Redis、PostgreSQL NOTIFY、HTTP API),不可共享内存或全局变量
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











