FrankenPHP 1.3 Worker模式需四要素协同:必须显式用frankenphp-worker --script /abs/path/worker.php --addr :port启动;worker.php须分初始化、请求循环、清理三层,禁用exit/die;环境变量须预注入,不加载.env;--addr不可省略。

FrankenPHP 1.3 的 Worker 模式不是“开个开关”就能用,而是需要明确入口、路径、环境和脚本结构四要素协同。它不自动识别 index.php,也不继承 .env,更不会重置请求上下文——所有这些都得你手动写清楚。
指定绝对路径的 worker 入口脚本
必须用 frankenphp-worker 命令显式启动,并带 --script 参数,且值必须是绝对路径:
./frankenphp-worker --script /var/www/myapp/public/worker.php --addr :8080- 不能写
--script public/worker.php或./public/worker.php—— 独立二进制不保证工作目录,相对路径必然失败 - 确保该文件真实存在、PHP 可读、且能加载
vendor/autoload.php
编写符合生命周期的 worker.php
这个文件必须严格分三层:初始化(一次)、请求处理(循环)、清理(每次),不能照搬 index.php:
- 循环外:加载 autoloader、创建并 boot Kernel(如 Symfony)或 App(如 ThinkPHP)
- 循环内:用
frankenphp_handle_request(function () { ... })包裹完整请求逻辑,包括构建 Request、调用 handle、send Response - 每次请求后:手动调用
gc_collect_cycles(),重置$_SERVER['REQUEST_URI']等关键字段 - 禁止
exit、die、return出主函数体,否则整个 worker 进程终止
预注入环境变量,不依赖 .env
独立二进制不自动加载 .env,Dotenv 在常驻进程中只生效一次,后续无法变更:
立即学习“PHP免费学习笔记(深入)”;
- 启动前通过系统环境变量传入:例如
APP_ENV=prod APP_DEBUG=0 ./frankenphp-worker --script ... - Docker 中用
environment:字段;宝塔面板在站点设置 → 环境变量里添加 - 不要在 worker.php 里调用
Dotenv::createUnsafeImmutable()->load()—— 它不会重复生效
监听地址与端口必须显式声明
--addr 不是可选参数,漏掉会导致进程立即退出并报错 “flag needs an argument”:
- 写成
--addr :8080(监听所有 IPv4/IPv6)、--addr 127.0.0.1:8080(仅本地)或--addr [::1]:8080(仅 IPv6) - 避免使用默认端口(如 :80),防止被其他服务占用导致静默失败
- 多站点需多个实例时,每个
--addr必须唯一,不可复用



















