phpEnv不支持数据库连接池,仅可通过PDO::ATTR_PERSISTENT启用进程内连接复用;持久连接需配合PHP-FPM、正确配置php.ini及MySQL参数,并避免混用驱动或开启Xdebug。

phpEnv 是一个本地开发环境工具(类似 XAMPP、WAMP),它本身不提供数据库连接池功能,也不支持运行 Swoole 或常驻进程。在 phpEnv 下直接配置“数据库连接池”属于概念误用——你无法在传统 CGI/FPM 模式下获得真正的连接池,只能做有限的连接复用和参数调优。
phpEnv 里启用 PDO 持久连接是唯一可行方式
phpEnv 默认使用 Apache + PHP-FPM 或 CGI 模式,每个请求独占进程/线程,连接生命周期随脚本结束而释放。此时唯一能复用连接的方式是开启 PDO::ATTR_PERSISTENT,让 PHP-FPM 子进程在内部缓存连接句柄。
- 必须显式传入选项:
[PDO::ATTR_PERSISTENT => true],仅在 DSN 中加persistent=true不生效 - 连接复用只发生在同一 FPM worker 进程内;不同 worker 之间不共享,所以实际复用率取决于请求是否被调度到相同子进程
- 务必配合
PDO::MYSQL_ATTR_INIT_COMMAND => 'ROLLBACK; RESET SESSION',否则事务残留或变量污染会导致后续请求出错 - 若 phpEnv 使用的是 CGI 模式(非 FPM),
PDO::ATTR_PERSISTENT会被忽略——此时持久连接完全无效
监控 Threads_created 才知道持久连接有没有真起作用
MySQL 的 Threads_created 状态值持续上升,说明每次请求都在新建连接,持久连接没生效。常见原因有:
- PHP 配置中禁用了持久连接:检查
php.ini是否存在mysql.allow_persistent = Off或mysqli.allow_persistent = Off - phpEnv 启动时加载了多个
php.ini文件,实际生效的配置被覆盖(可通过php --ini和phpinfo()确认) - 代码中混用了
new mysqli()和new PDO(),而只有 PDO 设置了持久化,mysqli 仍走短连接 - MySQL 端
wait_timeout小于 PHP 请求处理时间,连接被服务端主动断开,下次复用时报MySQL server has gone away
别在 phpEnv 里折腾 ProxySQL 或 Swoole
ProxySQL 需独立部署、监听端口(如 6033),而 phpEnv 默认不开放额外端口,也无 systemd 或 service 管理能力;Swoole 要求启用协程扩展并改用 swoole_http_server 替代 Apache,这与 phpEnv 的设计目标冲突——它面向快速本地调试,不是生产级高并发环境。
立即学习“PHP免费学习笔记(深入)”;
- 强行在 phpEnv 中装 Swoole 并启动 HTTP Server,会导致 Apache 和 Swoole 竞争 80 端口,且无法通过浏览器直接访问(除非手动改端口并配 host)
- ProxySQL 安装后需手动配置
mysql_servers、mysql_query_rules,phpEnv 无配套管理界面,调试成本远超收益 - 本地开发阶段真正瓶颈通常不是连接数,而是 SQL 效率、缓存缺失或 Xdebug 开启——先关掉 Xdebug 再谈连接池
phpEnv 的定位就是开箱即用的本地环境,它没法也不该承载连接池逻辑。真要验证高并发连接优化效果,得切到真实部署环境:FPM + Nginx + ProxySQL,或者 Swoole 常驻服务。本地调优重点应放在 SQL 本身、索引、缓存策略这些跨环境通用的点上。



















