文档章节

swoole项目思维转换 -- mysql server gone away

摇滚哈哈狗
 摇滚哈哈狗
发布于 2015/10/15 11:20
字数 661
阅读 345
收藏 9

mysql做为php的黄金搭档和互联网上应用最广泛的数据库,免不了天天与之打交道,不少朋友在熟悉swoole的使用之后,也趟平了不少坑,准备实战了,终于上线了,正愉快的体验swoole带来的巨大改进,突然数据库操作bug了,大量报mysql server gone away, 于是swooler心里千万之草尼马奔腾而过,大骂,swoole误我~~~

且慢!!!这真不是swoole的问题!!!!不是swoole的问题!!!!不是swoole的问题!!!!(重要的事情说三遍)


原因

    不是swoole的问题,那他的原因是什么呢?

    这要从mysql的机制说起,mysql本身是一个多线程的程序,每个连接过来,会开一个线程去处理相关的query, 所以mysql为了避免占着毛坑不拉屎,会定期回收长时间没有任何query的连接(时间周期受wait_timeout配置影响),所以在swoole中,由于是一个长驻内存的服务,我们建立了一个mysql的连接,不主动关闭 或者是用pconnect的方式,那么这个mysql连接会一直保存着,然后长时间没有和数据库有交互,就主动被mysql server关闭了,之后继续用这个连接,就报mysql server gone away了。


解决方案

    知道问题产生的原因,就可以对症下药了。

    方案1:  修改mysql的wait_timeout值为一个非常大的值。

                 此方法不太可取,可能会产生大量的sleep连接,导致mysql连接上限了, 建议不使用。

    方案2:每次query之前主动进行连接检测

                 如果是用mysqli,可用内置的mysqli_ping

                 示例:

      if (!$mysqli->ping()) {  

         mysqli->connect(); //重连

    }

                 如果是pdo,可以检测mysql server的服务器信息来判断:

            try {

                    $pdo->getAttribute(\PDO::ATTR_SERVER_INFO);

                } catch (\Exception $e) {

                    if ($e->getCode() == 'HY000') {

                        $pdo = new PDO(xxx);  //重连

                    } else {

                        throw $e;

                    }

                }


但这个方案有个缺点:额外多一次请求,所以改进方法:  用一个全局变量存放最后一次query的时间,下一次query的时候先和现在时间对比一下,超过waite_timeout再重连. 或者也可以用swoole_tick定时检测。

          方案3:被动检测, 每次query用try catch包起来,如有mysql gone away异常,则重新连接,再执行一次当前sql.
                    示例:

               try {

                    query($sql);

                } catch (\Exception $e) {

                    if ($e->getCode() == 'HY000') {

                        reconnect(); //重连

                        query($sql)

 

                    } else {

                        throw $e;

                    }

                }


        方案4: 用短连接,务必每次操作完之后,手动close

额外问题:mysql为什么需要连接池?


本文转载自:http://guangla.lofter.com/post/1d337f35_8890290

摇滚哈哈狗
粉丝 14
博文 226
码字总数 28445
作品 0
深圳
程序员
私信 提问
swoole项目思维转换 -- 前篇

PHP是最好的语言,Swoole重新定义了最好的语言,这当然是个梗了,不过php做为一个入门低、开发快、执行效率高的一门语言,而在以快速著称的pc互联网时代,无可争议的成为首选,这是php的优势...

杨太化
2015/10/15
699
0
sql文件导入时报错2006 – MySQL server has gone away

导SQL数据库结构+数据时,如果数据是批量插入的话会报错:2006 - MySQL server has gone away。 解决办法:找到你的mysql目录下的my.ini配置文件,加入以下代码 maxallowedpacket=500M wait...

山海经
2013/11/14
3.8K
0
使用mysql的长连接

使用mysql的长连接 有个资料看得我云里雾里的。现在用自己的言语来总结一下,写文字,能够加深自己的理解。也会在写的过程中帮助自己发现理解方面瑕疵,继续查资料求证。 短链接的缺点:创建...

蜗牛奔跑
2016/03/09
31
0
qihoo Atlas测试相关问题

以下是笔者在搭建完qihoo Atlas后测试中遇到的一些问题以及解决方案: 1、使用mysql连接mysql_proxy的工作接口时候出现如下提示: > mysql -uremotename -p -h127.0.0.1 -P 4040 Enter pass...

刘榴
2013/07/17
98
1
Zabbix错误提示MySQL server has gone away解决

Zabbix错误提示MySQL server has gone away解决 相信细心的同学在使用Zabbix的过程中,会遇到[Z3005] query failed: [2006] MySQL server has gone away 这个错误提示,虽然出现错误提示,但...

it你好
2016/01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部