Swoole通过常驻内存、协程并发和连接池复用彻底重构PHP生命周期:opcode与框架初始化仅执行一次,协程I/O自动挂起唤醒,协程切换仅50纳秒,Swoole协程MySQL/Redis客户端复用连接池,全局资源跨请求复用但需主动管理内存。

当你在压测一个API接口,QPS卡在1200上不去,数据库连接数频繁告警,日志里全是“max_connections reached”,说明PHP-FPM模型已到极限——Swoole不是给PHP换了个更快的引擎,而是彻底重写了它的生命周期和I/O调度方式。
避免每次请求都重复加载和编译
PHP-FPM下,每个HTTP请求都要走一遍:打开文件→词法分析→语法分析→生成opcode→执行→销毁。其中opcode编译阶段开销显著,尤其加载Laravel/ThinkPHP等大框架时,单次编译可能耗时3–8ms。
启动Swoole HTTP服务器后,所有PHP代码仅在worker进程启动时编译一次,后续所有协程直接复用内存中已缓存的opcode。
框架初始化(Composer autoloader注册、配置解析、路由加载)也只执行一次,【切勿在onRequest回调里require动态文件,否则仍会触发重复加载】。
立即学习“PHP免费学习笔记(深入)”;
用协程并发替代同步阻塞等待
方法一:传统FPM模式下,并行调3个HTTP接口需串行执行,总耗时≈900ms(3×300ms)。
方法二:Swoole协程中,用Swoole\Coroutine\Http\Client发起3个get请求,协程自动挂起+唤醒,总耗时≈300ms(取最大值)。
关键点在于:遇到co::sleep、mysql->query、http_client->get等I/O操作时,当前协程让出CPU,Worker立即调度其他就绪协程——这依赖底层epoll/kqueue事件监听,不轮询、不空转。
协程切换开销仅约50纳秒,远低于线程(微秒级)或进程(毫秒级)切换成本。
连接池复用代替每次新建TCP连接
第一步:确认你正在使用协程版客户端——mysqli/PDO连MySQL、phpredis连Redis,在Swoole里仍是同步阻塞,必须替换。
第二步:用Swoole\Coroutine\MySQL替代原生MySQLi,启动时预建连接池(pool->set(['min' => 5, 'max' => 50])),请求只从池中取空闲连接。
第三步:连接对象常驻Worker进程内存,但协程间隔离,不会互相污染;三次握手、认证、释放连接全被绕过,毫秒级复用。
【若混用new mysqli()和Swoole\Coroutine\MySQL,会导致连接泄漏和协程调度器卡死】
常驻内存让全局资源跨请求复用
数据库连接池、Redis客户端、单例容器(如Container)、日志实例(Logger)在Swoole启动时创建一次,后续所有请求直接复用。
这省掉了每请求重建对象的开销,也避免了反复建立TCP连接引发的TIME_WAIT堆积和max_connections打满。
注意:静态属性、$GLOBALS、未unset的大数组会一直留在Worker进程内存里——【这不是“请求结束自动清空”,必须主动管理生命周期】。



















