ThinkPHP 5 标准运行模式下没有独立的数据库连接池配置项,优化响应时间主要通过开启 PDO 长连接或调整 MySQL 服务端参数实现。此方案适合高并发读取场景,但在写操作频繁或数据库重启时需注意连接失效风险。
先说结论:ThinkPHP 5 默认使用短连接,开启配置中的 persist 参数可启用 PDO 长连接以减少握手开销。
- 适合:PHP-FPM 环境下的读多写少业务场景
- 先做:修改 database.php 配置并检查 MySQL 最大连接数
- 再验证:通过 SHOW PROCESSLIST 确认连接复用情况
快速处理思路
由于 ThinkPHP 5 本身不提供连接池大小配置,优化重点在于启用持久连接。在 application/database.php 配置文件中,将 persist 参数设置为 true,同时确保 MySQL 服务端的 max_connections 足够支撑并发。
'persist' => true, // 开启长连接'wait_timeout' => 28800, // 配合 MySQL 等待时间为什么会这样
PHP-FPM 模式下每个请求结束后会销毁资源,默认每次请求都重新建立数据库连接。开启 persist 参数后,PDO 会在 PHP 进程存活期间复用连接,减少 TCP 握手和认证耗时,但并非真正的中间件级连接池。
分步处理
第一步,打开项目 application 目录下的 database.php 配置文件,找到 db_config 数组。
第二步,设置 'persist' => true,保存文件并清空 runtime 缓存。
第三步,登录 MySQL 数据库,执行 SHOW VARIABLES LIKE 'max_connections'; 确认最大连接数是否满足并发需求。
第四步,如果业务涉及数据库重启或主从切换,需在代码中增加连接异常捕获机制,避免使用 stale connection。
怎么验证是否生效
在 MySQL 服务端执行 SHOW PROCESSLIST; 命令,观察同一 PHP-FPM 进程发起的多次请求是否复用同一个 Connection ID。
检查应用日志,确认没有频繁出现的 Too many connections 错误。
公开资料中没有看到可靠的量化数据表明具体降低多少毫秒,实际效果取决于网络延迟和数据库负载。
常见坑
开启长连接后,如果 MySQL 服务端重启,PHP 端持有的连接句柄会失效,导致后续请求报错,需配合断线重连逻辑。
PHP-FPM 子进程数量过多且均开启长连接,可能瞬间耗尽 MySQL 的 max_connections,导致新请求无法连接。
事务处理中使用长连接需特别注意,确保事务在请求结束前正确提交或回滚,避免锁表。
常见问题
ThinkPHP 5 原生支持连接池吗?
不支持,TP5 标准版依赖 PDO 机制,仅支持通过 persist 参数开启长连接,无连接池大小配置。
开启长连接会影响事务吗?
会影响,长连接会保持事务状态,必须确保每个请求结束时事务已关闭,否则会影响后续请求。
Swoole 环境下如何配置?
Swoole 环境下需使用 Swoole 自带的数据库连接池组件,TP5 原生配置在 Swoole 常驻内存模式下可能不生效。
参考来源
- ThinkPHP 官方文档,ThinkPHP 5.0 开发手册 - 数据库配置,document.thinkphp.cn
- PHP 官方文档,PDO 构造函数 - PDO::ATTR_PERSISTENT,www.php.net