phpEnv需三层调优:MySQL层改my.ini中wait_timeout和interactive_timeout为28800秒并重启MySQL服务;PHP层用set_time_limit(0)或修改php.ini的max_execution_time并重启Apache;连接层通过PDO::ping()或mysqli::ping()保活,避免空闲断连。

phpEnv 是 Windows 下的集成环境包,它把 Apache、PHP、MySQL 打包在一起,开箱即用,但默认配置偏保守——wait_timeout 和 max_execution_time 都很低,跑定时脚本、大数据导出或长事务时很容易中断。修改必须分三层:MySQL 服务端、PHP 运行时、以及 phpEnv 自身的配置加载顺序。
改 MySQL 的 wait_timeout 和 interactive_timeout
phpEnv 的 MySQL 配置文件通常在 phpEnv\mysql\my.ini(不是 etc\ 下那个),直接编辑该文件,在 [mysqld] 段落末尾追加:
wait_timeout = 28800 interactive_timeout = 28800
注意点:
- 不要加引号,数值单位是秒,28800 = 8 小时
- 改完必须重启 phpEnv 的 MySQL 服务(通过 phpEnv 控制面板点「重启 MySQL」,不是只重启 Apache)
- 验证是否生效:用 phpMyAdmin 或命令行连上 MySQL,执行
SHOW VARIABLES LIKE '%timeout%';,确认两值已更新 - 如果用的是 phpEnv 内置的 MariaDB(部分版本),配置项名一样,无需改动
调 PHP 脚本最大执行时间 max_execution_time
phpEnv 默认用的是 php.ini(路径类似 phpEnv\php\php.ini),但要注意:它可能被 Apache 的 .htaccess 或运行时函数覆盖。优先级是:set_time_limit() > ini_set() > .htaccess > php.ini。
立即学习“PHP免费学习笔记(深入)”;
推荐做法:
- 对长期运行的脚本(如导出 CSV),开头就写
set_time_limit(0);,彻底取消限制 - 若只想全局延长,打开
phpEnv\php\php.ini,搜max_execution_time,改成比如max_execution_time = 600 - 改完必须重启 Apache(phpEnv 面板里点「重启 Apache」),否则不生效
-
ini_set('max_execution_time', '0')在 CLI 模式下无效,Web 请求中也受disable_functions限制,不如set_time_limit(0)直接
PHP 连接 MySQL 后保活:防空闲断连
即使 wait_timeout 设得再大,如果 PHP 脚本中间有长时间休眠(比如 sleep(300))、或连接闲置未发任何语句,MySQL 仍可能主动断开。这时 mysqli::ping() 或 PDO::ping() 是唯一可靠手段。
示例(PDO 场景):
$pdo = new PDO($dsn, $user, $pass);
// 后续某处要执行查询前
if (!$pdo->ping()) {
// 连接已断,重建
$pdo = new PDO($dsn, $user, $pass);
}
$pdo->query("SELECT ...");
关键提醒:
-
mysqli::ping()会重连,但PDO::ping()在 PHP 7.4+ 才原生支持;低版本需手动try/catch捕获PDOException - 不要依赖
mysqlnd的自动重连(MYSQLI_OPT_CONNECT_TIMEOUT等参数在 phpEnv 中常被禁用) - phpEnv 的 MySQL 默认没开
event_scheduler,如果要用定时清理连接,得手动在my.ini加event_scheduler = ON并重启
最易被忽略的是:phpEnv 的控制面板重启服务时,有时只重启了 Apache,忘了 MySQL;而 MySQL 配置改了不重启,wait_timeout 就永远是旧值。另外,有些 phpEnv 版本会把 php.ini 加载路径硬编码进 Apache 配置,改错文件位置会导致设置完全不生效。



















