今天在公司测试环境中和其他部门项目联调,等了好长时间也没有发现我负责项目数据传递过去,看日志发现出现:
exception:HY000:SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
首先说明 我的是后台php以守护进程的形式运行的
第一反应 以为是mysql挂了 看来下mysql也是ok的,带着不解百度了下,发现是mysql超时拒绝连接
mysql有连接参数:
wait_timeout=100
interactive_timeout=100
可以用:
how variables like “%timeout%”
去查看 默认都是八小时
- interactive_timeout
参数含义:
服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时) wait_timeout
参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数。
mysql会根据设置的timeout时间内如果连接空闲,就会断开连接回收资源。这就是问题所在 我的php以守护进程形式运行,使用PDO使用的单例模式,当长时间空闲链接,mysql就会释放连接,此时PDO单例有没有重试机制就会导致此问题
解决办法:
1.脚本设置超时时间,超过时间重新启动,或者pdo连接失败后重连
2.修改mysql的超时时间
我建议使用前者 而非后者