视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP程序mysql报错mysqlhasgoneaway
2020-11-09 08:43:52 责编:小采
文档


本文主要和大家分享 常驻内存的PHP程序mysql报错 mysql has gone away,在cli环境下,PHP程序需要长时间运行,客户端与MySQL服务器之间的TCP连接是不稳定的。

不稳定的原因有以下可能:

  • MySQL-Server会在一定时间内自动切断连接

  • PHP程序遇到空闲期时长时间没有MySQL查询,MySQL-Server也会切断连接回收资源

  • 其他情况,在MySQL服务器中执行kill process杀掉某个连接,MySQL服务器重启

  • 网络抖动

  • 这时PHP程序中的MySQL连接就失效了。如果仍然执行mysql_query,就会报一个MySQL server has gone away的错误。程序处理不到就直接遇到致命错误并退出了。所以PHP程序中需要断线重连。

    解决方案

    mysql_ping

    有很多人提出了mysql_ping的方案,每次mysql_query进行连接检测或者定时连接检测。

    这个方案不是最好的。原因是:mysql_ping需要主动侦测连接,带来了额外的消耗。定时执行mysql_ping不能解决问题,如刚刚执行过mysql_ping检测之后,连接就关闭了;

    捕获错误码,进行断线重连

    它的原理是:mysql_query执行后检测返回值,如果mysql_query返回失败,检测错误码发现为2006/2013(这2个错误表示连接失败),再执行一次mysql_connect执行mysql_connect后,重新执行mysql_query如果mysql_query返回成功,那么连接是有效的,这是一次正常的调用。

    众多知名的PHP常驻进程框架

  • swoole_framework中query方法。

  • $res = mysql_query($sql, $this->conn);if ($res === false)
    { if (mysql_errno($this->conn) == 2006 or mysql_errno($this->conn) == 2013)
     { $r = $this->checkConnection(); if ($r === true)
     {
     continue;
     }
     }
  • workerman中数据库连接类execute方法。

  •  protected function execute($query, $parameters = "")
     { try { ...
     } catch (PDOException $e) {
     // 服务端断开时重连一次 if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) {
     $this->closeConnection();
     $this->connect(); ...
     }
     }

    很明显捕获错误码,进行断线重连,是高可靠低消耗的方案,推荐大家在常驻环境里使用。

    thinkphp + phpworkman 使用

    TP+workman也会出现类似的情况,TP从 V5.0.6+版本开始,支持Mysql的断线重连机制,默认关闭,需要的话,在application/databases.php数据库配置文件中添加

    // 开启断线重连'break_reconnect' => true,

    这样就OK了。

    下载本文
    显示全文
    专题