“MySQL server has gone away”在XAMPP下90%以上由wait_timeout或max_allowed_packet配置不当导致,需修改my.ini中[mysqld]段的wait_timeout=28800、interactive_timeout=28800和max_allowed_packet=256M,并重启MySQL服务生效。

“MySQL server has gone away”在 XAMPP 环境下,90% 以上是 wait_timeout 或 max_allowed_packet 不匹配导致的,不是 MySQL 崩溃,也不是 PHP 版本问题。 直接改 XAMPP 自带的 my.ini 文件就能解决,无需重装或换环境。
确认当前 timeout 和 packet 值
先连上 XAMPP 自带的 MySQL(比如用 phpMyAdmin 或命令行)执行:
SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout'; SHOW VARIABLES LIKE 'max_allowed_packet';
注意:XAMPP 默认 wait_timeout 是 28800(8 小时),但 Windows 下某些版本实际加载后可能变成 60 秒;max_allowed_packet 默认仅 4M,导入大 SQL 或批量插入时极易触发错误。
- 如果
wait_timeout显示为 60 或 300,说明配置没生效或被覆盖 - 如果
max_allowed_packet≤ 4194304(即 4MB),基本可以确定是它卡住导入或长事务 - XAMPP 的 MySQL 配置文件路径通常是
C:\xampp\mysql\bin\my.ini(Windows)或/Applications/XAMPP/xamppfiles/etc/my.cnf(macOS)
修改 my.ini 中的 [mysqld] 段
打开 my.ini,找到 [mysqld] 区块,在其下方添加或修改三行:
[mysqld] wait_timeout = 28800 interactive_timeout = 28800 max_allowed_packet = 256M
关键点:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 必须同时设
wait_timeout和interactive_timeout,MySQL 文档明确要求两者一致才对新连接生效 -
max_allowed_packet值不能带单位缩写(如256MB错,256M对),也不能用科学计数法 - 不要写成
256 * 1024 * 1024,MySQL 不解析表达式,只认字面值+单位 - 改完保存,**必须重启 XAMPP 中的 MySQL 服务**(不是 Apache),否则不生效
导入大 SQL 文件前的临时补救
如果只是临时还原数据库、不想重启服务,可登录 MySQL 后立即执行:
SET GLOBAL max_allowed_packet = 268435456; SET GLOBAL wait_timeout = 28800; SET GLOBAL interactive_timeout = 28800;
但要注意:
- 这些是全局设置,只对后续新建连接有效;已存在的连接仍用旧值
- 执行完需退出当前客户端,再新开一个连接(比如关掉 phpMyAdmin 标签页重进)才能应用新参数
- 该方式重启 XAMPP 后失效,仅适合调试或一次性导入
- 如果导入中途报错中断,Navicat/DBeaver 等工具不会自动重连,得手动重试
PHP 脚本里别依赖“自动重连”
PHP 的 mysqli 和 PDO 在 XAMPP 默认配置下都不开启自动重连,即使你设置了 MYSQLI_OPT_CONNECT_TIMEOUT,它只管建连阶段,不管空闲断连。
所以:
- 不要指望
mysqli_ping()能兜底——它只检测连接是否还活着,不自动重连,且调用本身也可能失败 - 长任务(如导出/同步脚本)建议在关键查询前加
$mysqli->ping()+ 手动重连逻辑,而不是全靠 timeout 调大 - 更稳妥的做法是在脚本开头执行
$mysqli->query("SET SESSION wait_timeout = 28800"),确保单次请求生命周期内连接不断
真正容易被忽略的是:XAMPP 的 my.ini 有时会被多个进程读取(比如同时开 phpMyAdmin 和命令行),而 MySQL 实际加载的配置可能来自另一个同名文件(如 my-default.ini),务必用 SELECT @@config_file; 或 mysqld --verbose --help | findstr "Default options"(Windows)确认真实生效路径。

















