首页 > 数据库技术 > 详细

php5.4 邂逅 mysql has gone away

时间:2019-10-25 09:44:43      阅读:66      评论:0      收藏:0      [点我收藏+]
最近开发完一个系统需求,是跟一个网上书店(YES24)合作,用户在我们这边的网站购买网络课程,配套的书籍就让合作方发出,我们只要发出请求就可以了。

运营环境测试的时候发现了一个小问题,就是连续发出几个请求的话,除了第一个请求以外,其他几个请求虽然成功,但是没有存到数据库里,查看日志发现写着Mysql has gone away。。insert into table set (@#$%^&)

Mysql连接怎么会断呢?
经过一番搜索,发现了3种可能会导致Mysql has gone away的原因
1) 服务器内存不够,导致连接数过多会自动断掉
询问了SE,发现服务器是CPU8核 16G内存,排除这个可能性
2) max_allowed_packet设置太小,使得这个INSERT Query执行失败
用show global variables like ‘max_allowed_packet’查看发现设置是16M,我的Query不可能有16M大,排除
3) wait_timeout设定值太低
用show global variables like ‘%wait_timeout%‘查看发现只有10,虽然不确定是这个问题,但还是把这个设置改成了60

重新测试,成功。

但是我还是不明所以,为什么改成60就成功,10就失败了呢?
有一点我发现了,就是发出请求的时候,有一个认证的过程,但是有时候认证非常耗费时间(大概10秒左右),那个逻辑自己就用掉了这么多时间,所以最后到了INSERT的时候SESSION就被自动关闭了,但是这个10秒的机制是怎么运作的呢?

查看网上的博客发现mysql_connect函数会被之前的session影响,就是说如果用相同的参数再次执行该函数的时候,生成的不是一个新的link,而是原来的link,而原来的link10秒就过期了。解决的方法是给mysql_connect()的参数加上New_link Flag,具体是
原来 : mysql_connect($IP, $USER, $PASSWORD)
修改后 : mysql_connect($IP, $USER, $PASSWORD, TRUE)

现在这个项目使用的是Codeigniter2,具体mysql_connect是怎么执行的还得扒一扒源码,还好问题是解决了,希望后来人不要踩这个坑~

php5.4 邂逅 mysql has gone away

原文:https://blog.51cto.com/6768604/2444932

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!