phpEnv不控制数据库连接数,需修改MySQL的max_connections及wait_timeout等参数,并确认其实际加载的my.ini配置文件路径,重启服务后生效;同时需调优Apache的MaxRequestWorkers和PHP连接复用逻辑。
phpEnv 本身不控制数据库连接数,它只是 Windows 下的 PHP 环境集成包;真正要改的是 MySQL 的和 PHP-FPM(或 Apache)的并发进程/线程数。
直接在 phpEnv 界面点“MySQL 设置”改配置,大概率不生效——因为它的 MySQL 服务常以
方式启动,自定义配置文件路径容易被忽略,且改完不重启等于白改。
确认 MySQL 实际加载的配置文件路径
phpEnv 启动 MySQL 时往往用的是内置的
(不是标准的
),且可能藏在非预期位置。不找对文件,改了也白改。
进 phpEnv 控制面板 → MySQL → 点“服务管理” → 查看“启动命令”,重点找
后面的路径,例如
如果没显式指定
,MySQL 会按顺序查找:
(Windows 下优先级高于
),常见位置包括 MySQL 安装目录根、
用命令验证实际加载项:
,但注意:phpEnv 的 MySQL 常禁用远程登录,得进其自带终端或用本地 socket 连
修改 MySQL 的
和超时参数
即使找到正确配置文件,光调
也不够。Windows 下还有系统级限制(句柄数),而空闲连接不释放,照样卡死。
在确认的
文件中,定位
段,添加或修改:
必须设低(建议 30–120 秒),否则 PHP 脚本结束后连接仍挂为
,
里一堆
就是它干的
改完必须重启 MySQL 服务(phpEnv 面板里点“重启”),
是临时的,服务一重启就丢
Windows 默认单进程句柄上限是 16384,若
设到 500+,还得进注册表改
(不推荐,优先压低
)
PHP 层别让每个请求都新建连接
phpEnv 默认配的是 Apache + mod_php,每个请求 fork 一个进程,如果脚本里写
或
不复用,连接数会随并发请求数线性爆炸。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
禁用持久连接:
构造时不加
;
别用
把连接对象提到请求外(如全局变量或单例),但注意 Apache 的 prefork MPM 下进程不共享内存,只能靠每个进程自己缓存一个连接——这就要求你确保脚本结束前不
或覆盖它
更稳妥的做法:用
或置
显式断开,尤其在长循环或异常分支里,避免连接泄漏
检查代码里有没有在
循环里反复
,这是高频雷区
Apache 并发能力要匹配,否则前端就堵死了
phpEnv 的 Apache 默认是
,只支持一个工作进程,
(旧名
)默认才 150。就算 MySQL 能扛 500 连接,Apache 先把你拦在门外。
编辑
(或主
中的
段)
调高关键参数(根据内存调整,每 Apache 进程约吃 5–10MB):
改完必须重启 Apache,且注意 Windows 下
不支持动态进程管理,
就是硬上限
如果并发真上 300+,建议换 phpEnv 的 Nginx + PHP-FPM 组合(面板里可切换),Nginx 的
更可控
最常被忽略的一点:phpEnv 的 MySQL 日志默认关闭,
不生效时,错误只打在 Windows 事件查看器里,而不是 MySQL 错误日志。务必打开
并检查该文件,里面会有 “Could not increase number of max_open_files” 这类关键提示。
max_connectionsmysqld --defaults-file=...my.inimy.cnf--defaults-file=C:\phpEnv\mysql\my.ini--defaults-filemy.inimy.cnfC:\Windows\mysql -u root -p -e "SHOW VARIABLES LIKE 'config_file';"max_connectionsmax_connectionsmy.ini[mysqld]max_connections = 200
wait_timeout = 60
interactive_timeout = 60wait_timeoutSleepSHOW PROCESSLISTCommand: Sleep, Time > 300SET GLOBAL max_connections = 200max_connectionsHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuotawait_timeoutnew mysqli()new PDO()PDOPDO::ATTR_PERSISTENT => truemysqlimysqli_pconnect()unset()mysqli::close()$mysqli = nullfornew PDO()mpm_winntMaxRequestWorkersMaxClientsC:\phpEnv\apache\conf\extra\httpd-mpm.confhttpd.confmpm_winnt_moduleThreadsPerChild 250
MaxRequestWorkers 250
mpm_winntMaxRequestWorkersworker_connectionsmax_connectionslog_error = C:/phpEnv/mysql/data/error.log