thinkphp 可直接部署到frankenphp 1.4的worker模式,需替换public/worker.php、只初始化一次框架、循环调用$app->http->run()并主动清理容器与超全局变量,配置caddy启用worker指令,设置pdo持久连接并避免连接泄漏。

ThinkPHP 可以直接部署到 FrankenPHP 1.4 的 worker 模式,无需重写业务逻辑,但需替换入口脚本、调整配置并确保运行环境就绪。核心是让框架初始化只执行一次,请求处理在常驻进程中循环复用,同时主动清理上下文避免残留。
确认项目结构与基础依赖
确保你的 ThinkPHP 项目符合标准布局:
-
public/ 是 Web 根目录,含
index.php(后续将被替换)和静态资源 - app/、config/、runtime/、vendor/ 等目录完整存在
-
runtime/ 目录可读写:Linux 下建议
chmod -R 755 runtime,否则日志、缓存、模板编译会失败 - 已安装
ext-json、ext-pdo、ext-opcache等必需扩展;若用 Redis 缓存或队列,还需对应扩展
替换入口文件为 worker 兼容版本
不能直接用 public/index.php 启动 worker,必须改用 FrankenPHP 官方适配的启动脚本(TP6/TP8 均有模板):
- 下载或手写
public/worker.php,内容以frankenphp_handle_request()包裹请求处理逻辑 - 框架初始化(如
think\Container::getInstance()、think\App::init())放在循环外,只执行一次 - 每次请求内调用
$app->http->run(),结束后显式执行$response->send()和$app->http->end() - 关键清理操作建议加入:调用
think\Container::clear()重置容器实例,手动unset($_GET, $_POST, $_FILES)避免超全局变量污染
Caddyfile 中启用 worker 模式
在 Caddy 配置中指定 worker 脚本路径(必须为绝对路径),并关闭自动索引探测以提升性能:
example.com {
root * /var/www/myapp/public
php {
worker /var/www/myapp/public/worker.php
}
file_server
}
-
worker指令必须在php块内,且路径不可用相对路径 - 不需额外重写规则,FrankenPHP 自动解析 PATH_INFO 或 QUERY_STRING 风格 URL
- 建议加上
log指令分离访问日志,便于排查请求生命周期问题
数据库与连接池适配
Worker 模式下 PDO 连接会被进程复用,必须显式管理,否则会出现 MySQL server has gone away 或连接数耗尽:
- 在
config/database.php中设置'persistent' => true启用持久连接 - 禁用框架自动关闭连接行为:确认未在中间件或命令行中调用
Db::close()或Connection::disconnect(),除非你明确需要释放 - 高频循环逻辑中避免反复调用
Db::getPdo()后不释放;如有必要,用try/finally确保unset($pdo) - 建议在 MySQL 服务端设置
wait_timeout≥ 300 秒,并配合应用层心跳检测
验证与调试要点
启动后重点观察三类信号,快速定位典型问题:
- 首次请求慢? 正常——这是框架初始化耗时,后续请求应明显变快(实测 TP6 QPS 提升约 2.3 倍)
-
第二次请求出错(如 session 冲突、缓存错乱)? 检查是否遗漏
Container::clear()或未重置$_SERVER['REQUEST_METHOD']等关键变量 -
日志报
failed to open stream: No such file or directory? 大概率是worker路径用了相对路径,或 Caddy 进程用户无权读取该文件 - 查看
runtime/log/和 Caddy 的 error log,FrankenPHP 会在请求异常时输出具体 PHP 错误堆栈
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











