Mysql server has gone away

php作为常驻内存进程跑一些数据或者任务的时候,有时候会出现“Mysql server has gone away” 或者 “mysql server is hung up”这种异常,表现为mysql server正常提供服务, 但是php进程一直报异常, 重启php进程,异常消失。

一开始百思不得其解,去年还咨询了鸟哥,后来被公司做数据的同学一句话点醒。我们的项目直接使用pdo访问mysql,简单封装的data层,提供了单例的pdo对象,没有连接池,没有重试的机制。如果提供web服务,没什么问题。但是作为后台程序,常驻内存运行,运行期间如果mysql因为负载过高hung住,或者mysql server主动断开了跟客服端的连接。此时php进程一直使用不能连接的pdo对象访问mysql。结果如上。

解决办法:

  • 一种是每次发送数据库请求之前ping一下,如果返回异常则重新创建connection; mysqli 扩展提供了ping的方法,pdo没有提供ping方法,可以query("select 1")替代;这种方案的缺点是每次访问需要多发送一次请求,有些损耗性能。
  • 还有一种是在数据层统一捕获异常:code 2006,然后创建新的connection。
Comments
Write a Comment