超级诡异的MySQL server has gone away解决办法

可能原因有3:

1,mysql服务端与客户端版本不匹配。

2,Mysql服务端配置有缺陷或者优化不足

3,需要改进程序脚本

通过更换多个服务端与客户端版本,发现只能部分减少报错,并不能完全解决。排除1。

对服务端进行了彻底的优化,也未能达到理想效果。在timeout的取值设置上,从经验值的10,到php默认的60,进行了多次尝试。而Mysql官方默认值(8小时)明显是不可能的。从而对2也进行了排除。(更多优化的经验分享,将在以后整理提供)

针对3对程序代码进行分析,发现程序中大量应用了类似如下的代码(为便于理解,用原始api描述):

$conn=mysql_connect( ... ... );

... ... ... ...

if(!$conn){ //reconnect

$conn=mysql_connect( ... ... );

}

mysql_query($sql, $conn);

这段代码的含义,与Mysql官方建议的方法思路相符[ If you have a script, you just have to issue the query again for the client to do an automatic reconnection. ]。在实际分析中发现,if(!$conn)并不是可靠的,程序通过了if(!$conn)的检验后,仍然会返回上述错误。

对程序进行了改写:

if(!conn){ // connect ...}

elseif(!mysql_ping($conn)){ // reconnect ... }

mysql_query($sql, $conn);

经实际观测,MySQL server has gone away的报错基本解决。

 

BTW: 附带一个关于 reconnect 的疑问,

在php4x+client3x+mysql4x的旧环境下,reconnet的代码:

$conn=mysql_connect(...) 可以正常工作。

但是,在php5x+client4x+mysql4x的新环境下,$conn=mysql_connect(...)返回的$conn有部分情况下不可用。需要书写为:

mysql_close($conn);

$conn=mysql_connect(...);

返回的$conn才可以正常使用。原因未明。未做深入研究,也未见相关讨论。或许mysql官方的BUG汇报中会有吧。

关键词: mysql , php

上一篇: 明天回家了
下一篇: Analyzing the Linux Kernel vmsplice Exploit

相关文章
访客评论
#1
回复 amxku 2008-02-15, 19:52:30
http://www.jimmydong.com/blog/post/1/123
#2
回复 路过 2008-02-20, 22:42:48
没看明白?呼呼,啥东东
#3
回复 老鬼 2008-02-21, 20:26:28
好长时间没见到你出来活动了啊?
#4
回复 火影忍者站 2008-02-24, 14:59:01
没看明白?啥东东
#5
回复 landso 2009-12-30, 23:53:16
有个问题,如果判断这样写的话
if(!conn){ // connect ...}

elseif(!mysql_ping($conn)){ // reconnect ... }

mysql_query($sql, $conn);


if(!conn)通过后 不会再去判断(!mysql_ping($conn))了。。。
发表评论

评论内容 (必填):