frankenphp 1.1 启用 worker 模式需显式声明入口路径并改造脚本逻辑:命令行用 --worker、caddyfile 写 php { worker ./path }、docker 设 frankenphp_config;入口脚本须加 ignore_user_abort(true),框架初始化放循环外,请求处理放 frankenphp_handle_request 回调内,并主动清理状态防污染。

在 FrankenPHP 1.1 中启用 worker 模式,关键不是“开关”,而是显式声明 worker 入口路径并改造 PHP 脚本的执行逻辑。它不依赖配置文件里的布尔值,而是靠启动方式和代码结构来激活常驻行为。
确认启动方式指向 worker 入口
FrankenPHP 1.1 不再自动识别 worker 模式,必须明确告诉它哪个文件是 worker 主入口:
- 命令行启动:运行
frankenphp php-server --worker ./public/index.php(路径需真实存在且可读) - Caddyfile 配置:在对应站点块中写
php { worker ./public/index.php } - Docker 环境:通过环境变量传入
FRANKENPHP_CONFIG="worker ./public/index.php"
修改入口脚本适配常驻生命周期
普通 FPM 入口是一次性执行,而 worker 模式要求你手动管理初始化与复用。必须做三件事:
- 开头加
ignore_user_abort(true);,防止客户端断连中断整个 worker 进程 - 将框架初始化(如 Laravel 的
$app = require_once ...)放在while (frankenphp_handle_request(...)) { }循环外,只执行一次 - 把实际请求处理逻辑(如
$response = $kernel->handle($request))放进frankenphp_handle_request()的回调里
每次请求后主动清理状态
worker 模式下 PHP 进程不退出,变量、连接、实例会跨请求残留。不清理就会污染下一个请求:
- 调用
gc_collect_cycles();触发垃圾回收 - Laravel 用户建议在请求结束时执行
$app->resetResolvedInstances();和$app->forgetInstance('request'); - 禁用数据库持久连接(
PDO::ATTR_PERSISTENT => false),或显式调用DB::disconnect()
验证是否真正进入 worker 模式
光看进程没退出还不够,要确认请求确实复用了同一进程上下文:
- 在入口文件循环外定义一个静态计数器(如
static $initCount = 0; echo "init: " . ++$initCount . "\n";),刷新多次页面,输出应始终为init: 1 - 在循环内打印内存使用(
echo memory_get_usage() . "\n";),连续请求间数值波动应较小,无大幅重置 - 用
ps aux | grep frankenphp观察进程数是否稳定,不随并发增长而线性增加
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











