webman的“常驻内存”是其根本生命周期模型,worker进程启动后类、路由、连接池、静态变量全部驻留内存直至手动stop或崩溃;onworkerstart是唯一安全全局初始化时机,但不可执行阻塞操作,所有new实例(如数据库连接池)须在此处创建,且严禁在onrequest中new大对象或捕获$request导致内存持续增长。

Webman 的“常驻内存”不是配置开关,而是整个生命周期模型的切换——Worker 进程启动后,类、路由、连接池、静态变量全部留在内存里,直到你手动 stop 或进程崩溃。
Worker::$onWorkerStart 执行时机与作用域陷阱
这个回调只在每个 Worker 子进程启动时执行一次,是唯一安全做“全局初始化”的地方。但它不是“框架启动完成钩子”,更不等于 Laravel 的 Service Provider boot()。
- 所有
new实例(如数据库连接池、Redis 客户端、SDK 客户端)必须放在这里,否则每次请求都 new 会快速耗尽内存或连接数 - 不能在其中调用
sleep()、file_get_contents()或任何同步阻塞操作,否则整个 Worker 事件循环卡死 -
require或include配置文件没问题,但别在里面做耗时解析(比如json_decode(file_get_contents(...))) - 不要把
$request或控制器实例存进static属性——它们属于单次请求上下文,强引用会导致后续所有请求都无法释放
为什么 onRequest 中 new 大对象会持续吃内存
Webman 不像 FPM 那样“请求结束即销毁全局符号表”。onRequest 回调里创建的对象,只要还有变量引用它,PHP GC 就不会回收;而闭包、静态缓存、未 unset 的临时数组都会形成隐式引用链。
- 典型错误:
static::$cache[$id] = json_decode($rawJson, true);—— 每次请求塞一个大数组进去,永远不清理 - 更隐蔽的:
$handler = function () use ($request) { ... };——$request带着整个上传文件、原始 body、header 数组,闭包一捕获就钉死几 MB - 正确做法:用
unset($bigArray)显式切断;或改用流式处理(yield+cursor());或把数据 ID 存缓存,按需查库 - 验证方式:
memory_get_usage(true)在中间件末尾打点,对比压测前后是否回落;若不降,说明有长生命周期引用
StaticFile 中间件为何有时不生效
它不是“开了就加速”,而是依赖路径匹配、中间件顺序和响应拦截三重条件同时满足。漏掉任意一环,就会退化成普通控制器返回。
- 必须确认
config/static.php中'enable' => true,且'middleware'数组里明确写了app\middleware\StaticFile::class - 中间件顺序必须在
RouteMiddleware之后、ControllerMiddleware之前,否则$request->path()还没被标准化,匹配不到真实文件路径 - 不能在控制器里写
return response()->file(...)—— 这绕过了 StaticFile 的所有优化逻辑(ETag、Last-Modified、range 请求支持) - 生产环境别指望它扛住全部静态资源流量,CDN +
Cache-Control: public, max-age=31536000才是正解,中间件仅作兜底
连接池复用失效的四个信号
连接池本该降低新建连接开销,但如果配置或使用不当,反而比直连更慢、更占内存。
- 现象:压测时
netstat -an | grep :3306 | wc -l持续上涨,远超$pool->getMaxConnections()设置值 - 原因一:没用异步客户端(如
workerman/mysql),PDO 还在同步阻塞,连接池只是“假复用” - 原因二:在
onRequest里每次 newDb::connection(),而不是从容器取已初始化的实例 - 原因三:事务没显式
commit()或rollback(),连接一直被标记为“busy”无法归还 - 原因四:连接健康检测关闭(
'check_health' => false),失效连接堆积在池中,后续请求拿到就报错
真正难的从来不是看懂 Worker::runAll() 调用了几次,而是想清楚哪个变量该活过一次请求、哪个该活过整个 Worker 生命周期、哪个根本不该存在。常驻内存不是省事,是把责任从 PHP 引擎移交到了开发者手上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











