thinkphp本身无max_connections配置项,该参数属mysql服务端,需在my.cnf的[mysqld]段设置并重启mysqld;tp6启用连接复用的关键是database.php中配置deploy => 1,否则pool相关配置无效。

max_connections不是TP配置项,而是MySQL服务端参数
ThinkPHP本身没有max_connections这个配置项。你在database.php里写'max_connections' => 100完全无效——它既不会被框架读取,也不会影响连接行为。真正起作用的是MySQL服务端的max_connections变量。常见错误是压测时QPS卡在20,日志反复报Too many connections,结果回头改TP配置,白忙活。
验证当前值:mysql -uroot -p -e "SHOW VARIABLES LIKE 'max_connections';"
修改位置:必须写进/www/server/mysql/etc/my.cnf的[mysqld]段内,例如:
[mysqld] max_connections = 500
改完要systemctl restart mysqld,宝塔面板点“重启”可能不生效。
TP6启用连接复用的关键开关是deploy => 1
ThinkPHP 6 默认走短连接,每次请求新建PDO、请求结束销毁。所谓“连接池”,其实是框架层对同配置PDO实例的缓存复用,前提是开启deploy => 1。不设这个,其他所有pool相关字段(比如pool_size、pool_time)都只是摆设。
-
deploy => 1必须加在database.php的数据库配置块里,哪怕你没配从库、rw_separate => false也得开 - 复用只对「相同host + 相同database + 相同username」生效;换库名或账号就会新建池子
-
pool_time => 3600建议配上,单位秒,否则空闲连接永不释放,慢慢堆满MySQL上限 -
debug => true时复用被禁用,开发期可开,上线必须关
Swoole环境下才真正需要Db::pool()
FPM模式下每个请求独立进程,连接复用意义有限;Swoole常驻内存模型下,Db::pool()才是真连接池入口,但它不认database.php里的pool配置,而要看config/swoole.php里的db_pool节点。
- 必须安装
topthink/think-swoole >= 3.1.0且swoole >= 4.8.0 - 普通查询写
Db::table()仍走传统连接;要用池,必须显式写Db::pool()->table() -
max_active => 8是硬上限,超出请求会排队,默认最多等2000ms,超时抛PoolTimeoutException - 事务必须用
Db::pool()->transaction(),否则事务连接不归还池子,几秒就耗尽
为什么调了max_connections还是连不上
连接拒绝(Connection refused)或Too many connections从来不是单一原因。它暴露的是三层错位:
- MySQL侧:
max_connections设太小,或者wait_timeout太短导致连接频繁重建 - PHP侧:FPM的
pm.max_children设太高,每个子进程都持一个连接,总数轻易撞上限 - 应用侧:事务没
commit/rollback、CLI任务忘了Db::close()、异常分支漏处理,连接卡在Transaction或Sleep状态不释放
最该先做的不是改配置,而是连上MySQL执行SHOW PROCESSLIST,盯住Time列超过30秒的Sleep连接——它们大概率就是你的代码里漏掉的那几个Db::close()或未捕获的事务异常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











