如果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

01-15 22:21
查看更多