phpEnv中修改MySQL的wait_timeout必须编辑my.ini配置文件,在[mysqld]下添加wait_timeout=600和interactive_timeout=600,并以管理员权限保存后重启MySQL服务,否则无效;同时需确保PHP连接池最大存活时间小于该值并启用探活机制。

phpEnv里改MySQL的wait_timeout要动服务端配置文件
phpEnv只是个Windows下的PHP集成环境,它自带的MySQL服务默认沿用官方8小时(28800秒)空闲断连策略。你不能在PHP代码或phpEnv界面里点几下就改掉这个行为——必须手动编辑MySQL的配置文件。
找到phpEnv安装目录下的mysql\my.ini(常见路径如C:\phpEnv\phpEnv\mysql\my.ini),用记事本以管理员身份打开,在[mysqld]段落下添加两行:
wait_timeout = 600 interactive_timeout = 600
注意两点:一是两个参数必须同时设,否则非交互连接(比如PHP用mysqli或PDO建的)可能仍按默认值断;二是别设为0,MySQL会自动兜底成8小时,无效。
改完不重启MySQL服务等于没改
phpEnv右下角托盘图标里“重启MySQL”不是可选项,是必选项。只保存my.ini但没重启,SELECT @@wait_timeout查出来的还是旧值。
立即学习“PHP免费学习笔记(深入)”;
验证是否生效的方法很简单:
- 打开phpEnv附带的MySQL命令行(或用HeidiSQL、DBeaver连上去)
- 执行
SELECT @@wait_timeout, @@interactive_timeout; - 返回结果两个数字都得是你刚写的值(比如600),而不是28800
如果没变,大概率是没用管理员权限保存my.ini,或者重启的是Apache而不是MySQL。
PHP层不配合,光调MySQL参数照样报MySQL server has gone away
把wait_timeout从28800改成600后,如果PHP连接池(比如ThinkPHP的pdo连接池)里连接最大存活时间设成3600秒,那连接大概率在被PHP回收前就被MySQL先踢了。
更稳妥的做法是双向对齐:
- MySQL设
wait_timeout = 1800(30分钟) - PHP连接池配
pool_recycle = 1500(25分钟)或开启ping=True(PyMySQL)、options="--skip-ssl"不相关,重点是探活 - ThinkPHP用户直接开
'break_reconnect' => true,但得知道这只能补救,不能预防
另外,mysqli.reconnect=On在php.ini里开了也没用——这是MySQLi扩展的老参数,PHP 7.1+已废弃,且不处理连接池场景。
云数据库或远程MySQL时,SET GLOBAL大概率被禁用
如果你不是本地用phpEnv,而是连的阿里云RDS、腾讯云CDB这类托管MySQL,SET GLOBAL wait_timeout = 600会直接报错Access denied; you need (at least one of) the SUPER privilege(s)。
这时候只能走控制台:进对应云厂商的数据库参数模板,找wait_timeout和interactive_timeout两项,填值、应用、重启实例。有些厂商(如AWS RDS)还强制最小值≥60秒,填59会自动纠正。
真正容易被忽略的是:phpEnv本地调试时调通了,一上云就崩——因为云数据库默认值可能只有300秒,而你本地没同步改。



















