swoole结合php的pdo mysql模式出现MySQL server has gone away
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了swoole结合php的pdo mysql模式出现MySQL server has gone away,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2409字,纯文字阅读大概需要4分钟。
内容图文
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
内容总结
以上是互联网集市为您收集整理的swoole结合php的pdo mysql模式出现MySQL server has gone away全部内容,希望文章能够帮你解决swoole结合php的pdo mysql模式出现MySQL server has gone away所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。