xuechaoc 2019-03-29 08:49:53 4133次浏览 0条回复 0 2 0

最近自己瞎折腾了一个结合yii2-basic和workerman的简单rpc框架。

有兴趣可以帮忙纠正下错误或者疏漏之处,详见github

因为workerman是守护进程的方式,不可避免的遇到了mysql超时断开连接的问题

还是那一套解决方法,重写\yii\db\Command.php中的executequeryInternal方法,增加重连机制,这部分代码大多数地方都能找到,一切似乎很完美,直到运行起来测试才发现问题。

为了重现mysql断开连接的问题,连上mysql服务器,找到本机到服务器的链接,然后kill掉

SELECT * FROM  `information_schema`.processlist WHERE HOST LIKE '192.168.2.19%';

再次执行脚本,发现没有MySQL server has gone away的报错了。 但是变成了另外一个错误Invalid parameter number: no parameters were bound

爬了很多文章都只提到了断开重连的解决方案,并没有提到上述问题,直到看到了这篇文章Yii2 解决2006 MySQL server has gone away问题 因为在bindPendingParams方法最后,清空了$this->_bindParams属性,而由于ActiveRecord的find等方法会通过bind的方式传入表名和参数,所以重试之后那些参数已经不在了,自然会报错。

原文给出的解决方法是修改yii2框架的内容,注释$this->_bindParams = [];这一句,但是因为修改了框架内容,不利于框架升级,并且不能用composer安装,不便维护,所以不可取。

我的解决方法如下:

    /**
     * 利用$this->retry属性,标记当前是否是数据库重连
     * 重写bindPendingParams方法,当当前是数据库重连之后重试的时候
     * 调用bindValues方法重新绑定一次参数.
     */
    protected function bindPendingParams()
    {
        if ($this->retry) {
            $this->retry = false;
            $this->bindValues($this->params);
        }
        parent::bindPendingParams();
    }

查看详情\app\lib\Command.php

具体的分析过程可以上看我博客的这篇文章记一次Yii2中Mysql断开重连引起的Invalid parameter number: no parameters were bound错误修复

有疏漏之处欢迎指正,谢谢。

觉得很赞
    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册