必须手动修改phpenv中mysql的配置文件(如c:\phpenv\mysql\my.ini或conf\my.cnf),在[mysqld]段下添加wait_timeout=28800和interactive_timeout=28800,保存后通过phpenv界面或命令行重启对应mysql服务(注意服务名可能为mysql80等版本后缀),并执行select @@wait_timeout验证生效。

phpEnv 的 MySQL wait_timeout 不能通过 phpEnv 界面或控制台直接修改,必须手动改其底层 MySQL 配置文件并重启服务。
phpEnv 里 MySQL 的 wait_timeout 在哪改
phpEnv 是 Windows 下的集成环境套件,它封装的是 MySQL(通常是 MariaDB 或 MySQL 5.7/8.0),但不提供图形化参数配置入口。所有服务级变量都依赖 MySQL 自身配置文件:
- 默认配置路径是
C:\phpEnv\MySQL\my.ini(常见于旧版)或C:\phpEnv\MySQL\conf\my.cnf(新版或自定义安装) - 用记事本或 VS Code 以管理员权限打开该文件,在
[mysqld]段落下添加两行:
wait_timeout = 28800 interactive_timeout = 28800
⚠️ 必须同时设两个值,否则非交互式连接(PHP PDO/MySQLi)仍可能被提前断开。
保存后,通过 phpEnv 主界面「重启 MySQL」或命令行执行:net stop mysql && net start mysql(服务名可能为 mysql57、mariadb 等,需查 Windows 服务列表确认)。
为什么改了配置、重启了,PHP 还报 MySQL server has gone away
常见原因不是配置没生效,而是 PHP 层没配合:
- phpEnv 默认不启用连接池,PHP 脚本每次
new mysqli()或PDO::__construct()都新建连接,但若脚本长期运行(如 CLI 循环)、又没显式$conn->close(),连接会空闲超时 - PHP-FPM 下每个 worker 进程可能复用连接,但若
pm.max_requests设得过大(比如 10000),而连接空闲时间又超过wait_timeout,就会拿到已失效连接 - 某些 phpEnv 版本打包的 MySQL 编译时设了硬编码默认值(如 60 秒),覆盖配置文件——此时要验证实际运行值:
连进 MySQL 执行:SELECT @@wait_timeout, @@interactive_timeout;,看返回是否为你设的值。
PHP 代码层怎么避免被 wait_timeout 断连
光调 MySQL 参数不够,PHP 必须主动管理连接生命周期:
- Web 场景:每个请求结束前确保连接关闭(PDO 自动析构通常够用;mysqli 则建议显式调
$mysqli->close()) - CLI 长任务:在循环中定期 ping,例如每 5 分钟执行一次
$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)或直接$pdo->query("SELECT 1") - 如果用 PDO,可在 DSN 中加
;options=1002(即PDO::MYSQL_ATTR_INIT_COMMAND),但更稳妥的是捕获异常后重建连接 - 避免把数据库连接对象存成全局变量或静态属性跨请求复用——phpEnv 的 Apache + PHP 模块模式下极易出问题
最易被忽略的一点:phpEnv 启动的 MySQL 服务名常带版本后缀(如 mysql80),直接在 Windows 服务管理器里找错服务名,会导致你以为重启了,其实没动到真正的 MySQL 实例。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











