本文主要和人人分享 常驻内存的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了。
相干引荐:
常驻内存的PHP顺序mysql报错
以上就是PHP顺序mysql报错mysql has gone away的细致内容,更多请关注ki4网别的相干文章!