tp5.1接入swoole后,php常驻内存运行,带来性能提升与状态污染风险;需重置超全局变量、清理静态属性和全局变量,并配置max_request定期重启进程以防控内存泄漏。

TP5.1 项目接入 Swoole HTTP Server 后,最核心的变化是 PHP 不再按请求“启动-销毁”,而是常驻内存运行。这意味着代码只加载一次,全局状态会持续存在——这既是性能跃升的根源,也是出问题的高发区。
常驻内存带来的三大影响
一是类、配置、数据库连接等初始化操作仅执行一次,大幅减少重复开销;二是超全局变量($_GET、$_POST、$_SERVER)不会自动重置,需手动清理或重建;三是静态属性、全局变量、单例对象在多次请求间保持状态,容易引发数据污染或内存堆积。
必须重置的运行上下文
ThinkPHP 依赖 $_SERVER、$_GET、$_POST 等超全局变量构建 Request 对象。Swoole 的 request 回调中,这些变量不会自动刷新,必须显式映射:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 将 $request->server、$request->get、$request->post 分别赋值给 $_SERVER、$_GET、$_POST,并转为大写键名
- 避免直接读取原始超全局变量,一律通过 think\Request 实例获取参数
- 每次请求结束前,建议用 unset() 清理临时全局变量,尤其涉及文件句柄、资源型对象
内存泄漏防控要点
常驻进程不释放变量,是内存缓慢增长的主因:
- 禁用 global 声明的变量,改用依赖注入或方法参数传递
- 静态属性(static $cache = [];)务必在业务逻辑末尾清空或设为 null
- 启用 max_request(如设为 3000~5000),让 Worker 进程定期重启,强制回收内存
- Task 进程同样设置 task_max_request,防止异步任务积累引用
ThinkPHP 框架适配关键点
TP5.1 默认按 FPM 模式设计,直连 Swoole 需绕过部分生命周期:
- 在 onWorkerStart 中加载 thinkphp/start.php,而非入口文件,避免重复初始化
- 禁止在控制器构造函数中做耗时操作(如连接数据库),应延迟到 action 方法内按需建立
- Redis/MySQL 长连接可复用,但需确认驱动支持协程(如 pdo_mysql 需配合 Swoole\Runtime::enableCoroutine())
- 日志写入建议使用异步方式(如投递到 Task 进程),避免阻塞 Worker









