ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

swoole结合php的pdo mysql模式出现MySQL server has gone away

2020-01-04 20:04:07  阅读:529  来源: 互联网

标签:gone swoole away server mysql query 连接


       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

标签:gone,swoole,away,server,mysql,query,连接
来源: https://www.cnblogs.com/newmiracle/p/12150181.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有