今天的代码是以daemon的形式运行,初始化的时候会select一批数据,其余出于效率的考虑,只会在其他地方触发的时候让他连一次数据库,做一次select。
运行的时候,初始化的时候没有任何问题。过段时间有触发他做作select的时候,就会报MySQL server has gone away。
看了网上的分析,可能的原因有两种:一种是两次的请求的间隔时间超过了wait_timeout,服务断开连接了;还有一种是max_allowed_packet过小。
查看了my.cnf,max_allowed_packet=16M,初步怀疑是前者的原因。且在第一次select与触发查询之间有较长的时间间隔,而到知道连接不可用。
于是在每次select之前加上了mysql_ping(),如果ping失败,还要从新连接数据库。
因为用mysql_ping的时候也有可能遇到MySQL server has gone away的问题,相当于用mysql_ping测试连接是否可用。要不可用就把连接断了重新连接。比较巧妙的绕过了连接不可用的解决办法,最后问题得到解决。