导语 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- |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|