如果php脚本执行时间较长,超过mysql配置的wait_timeout时间之后,那么mysql就会自动断开当前连接,之后查询mysql就会报2006 MySQL server has gone away错误。
可以在操作mysql之前检测当前连接是否有效,如果发现当前连接已断开,那么再重新连接就可以了。
但是有个疑问,yii操作db有DAO和AR等方法,到底在哪块加这个检测机制呢
其实yii中不管用那种db操作方法,最终都会调用yii_framework->db->CDbConnection.php的createCommand获得db连接,由CDbCommand.php类的queryInternal()执行查询操作,execute()方法执行更新类操作。所以只需要这两个方法加上检测机制就可以了。
在CDbCommand.php文件最后新增方法
/** * 验证mysql连接是否有效 */ private function isConnectionOk() {
//getActive()方法返回数据库连接是否已经建立 if($this->_connection->getActive()){ try{ @$this->_connection->getPdoInstance()->query('select 1'); //注意:在此处加入@错误抑制符,用catch捕获错误,重新开启就可以 }catch (PDOException $e){
//设置打开或者关闭数据库连接 $this->_connection->setActive(false); $this->_connection->setActive(true); } } }
测试:
db操作 ...... sleep(10); ...... db操作
可以正常操作,不会再返回mysql server has gone away