pdo::attr_persistent 不是连接池,仅复用 php-fpm worker 内连接;proxysql 是对 php 最友好的真连接池方案;swoole 协程连接池才是唯一真正池化方案。

PDO::ATTR_PERSISTENT 不是连接池,别被名字骗了
PHP 8.5.5 本身没有数据库连接池机制——它连“连接池”这个概念都不原生支持。pdo_mysql 或 mysqli 扩展里找不到 connection_pool 配置项,php.ini 里也搜不到。所谓“设置连接池”,实际是选一条适配你架构的替代路径。
用 PDO 持久连接时,PDO::ATTR_PERSISTENT => true 怎么写才不翻车
这是最常见、也最容易误用的方式。它不是跨请求复用,而是复用 PHP-FPM worker 进程内的连接:
-
PDO::ATTR_PERSISTENT必须在new PDO()构造时传入,调用setAttribute()补设无效 - DSN 中不能带
&pconnect=1(那是旧版 mysqli 的写法,PDO 不认) - 必须确保所有请求使用完全一致的 DSN、用户名、密码,否则连接无法复用
- 事务未提交、临时表未清理、会话变量残留,下次复用时直接污染数据——线上偶发“查到别人的数据”多源于此
- MySQL 重启后,PHP 不会自动剔除失效连接,下一次
query()才报MySQL server has gone away
ProxySQL 是目前对 PHP 最友好的“真连接池”方案
它不改一行 PHP 代码,把连接池逻辑下沉到代理层,适合传统 FPM 架构:
- PHP 连接地址从
localhost:3306改成localhost:6033(ProxySQL 默认监听端口) - 务必开启
mysql-native_password插件,否则 PHP 8.2+ 默认认证方式握手失败 - 在 ProxySQL 中配置
max_connections和connect_timeout_server,控制后端连接上限 - 禁用 PDO 持久连接:和 ProxySQL 共存反而增加泄漏风险,
PDO::ATTR_PERSISTENT => true应设为false - 监控
stats_mysql_connection_pool表,重点关注ConnUsed和ConnFree,避免ConnActive长期满载
Swoole 协程连接池才是唯一能真正“池化”的方案
仅适用于常驻内存场景,比如 API 网关、WebSocket 服务、微服务后端:
- 必须用
Swoole\Coroutine\MySQL或Swoole\ConnectionPool,PDO/MySQLi 在协程中不安全 - 连接池大小要显式指定,例如:
new Swoole\ConnectionPool(function () { return new Co\MySQL(); }, 50) - 连接获取必须用
$pool->get(),用完必须$pool->put($conn),漏掉就泄漏 - 超时设置很关键:
$pool->get(2.0)表示最多等 2 秒,否则抛异常,避免阻塞整个协程调度 - PHP-FPM 下跑 Swoole?不行。Swoole 和 FPM 互斥,部署前必须切换运行模型
PDO::ATTR_PERSISTENT 的宣传。选错路径,轻则性能没提升,重则数据错乱。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











