解决MySQL server has gone away问题的两种有效办法

最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到MySQL的时候,发现MySQL的连接超时关闭了,于是就出现了“MySQL server has gone away”这样的错误提示,解决这个问题,我的经验有以下两点,或许对大家有用处:

第 一种方法:

当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。

第二种方法

这也是我个人认为最好的方法,即检查 MySQL的链接状态,使其重新链接。

可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:

这是我的的数据库操 作类中间的一个函数

function ping(){
	if(!mysql_ping($this->link)){
		mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键
		$this->connect();
	}
}

我需要调用这个函数的代码可能是这样子的

$str = file_get_contents(’http://www.tianqiyugao.net’);
$db->ping();//经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db->query(’select * from table’);

ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。

经 过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。

关键词: mysql

上一篇: 天气预报(www.tianqiyugao.net)
下一篇: 【转】256万买了辆W12缸6.0的大众辉腾,差点气晕!

相关文章
#1
回复 pader 2010-06-18, 12:23 PM
哎,我最近老是碰到 AJAX 跨域请求的问题,被搞头昏死了。

你抓取远程数据用 file_get_contents 抓的??
#2
回复 angel 2010-06-18, 10:03 PM
重点不是file_get_contents,重点是mysql_ping,呵呵。。
#3
回复 pader 2010-06-19, 10:28 AM
话说你的博客这个风格在IE6下头部一大片空白。
#4
回复 加气混凝土设备 2010-06-19, 10:52 AM
学习了 不错, 以后常来看看
#5
回复 优惠券 2010-06-20, 7:52 PM
学习了 不错, 以后常来看看
#6
回复 榆人 2010-06-23, 9:23 PM
有事请教,请与我联络。QQ=1549208801=QQ
#7
回复 懒人 2010-06-26, 12:22 AM
求4ngel.net/模板。SABLOG有这个模板吗?EMAIL:SB3389@QQ.COM
#8
回复 angel 2010-06-26, 4:30 AM
这个你另存为自己写就行了。。这个不是程序。4ngel.net全站纯手工HTML
#9
回复 lulu00147 2010-06-26, 8:51 AM
A大 sablog啥时候2.0正式版啊?
等的眼泪都下来了。。。。。
#10
回复 尘缘 2010-06-27, 11:26 AM
可能在开发的时候,重复代码会有点多,可以在增删改的查询前请执行ping函数。
#11
回复 Loveyuki 2010-06-27, 12:38 PM
为啥不弄成需要的时候再开启链接,用完就关闭呢?
#12
回复 angel 2010-06-27, 2:21 PM
因为连接是一直在使用中的。有时候因为系统设置的因素。导致连接MYSQL连接关闭了。但是PHP还在执行中。所以就再次连接。。
#13
回复 淘宝网商城 2010-06-30, 9:03 AM
感觉弄得复杂了点哦。。。
#14
回复 jinzihao 2010-07-13, 12:34 PM
我正为这个问题发愁呢,谢谢
#15
回复 80后门户 2010-07-16, 11:40 PM
学习了 不错, 以后常来看看
发表评论

评论内容 (必填):