记一次 Yii2 中 MySQL 断开重连引起的 Invalid parameter number: no parameters were bound 错误修复 [ 技术分享 ]
最近自己瞎折腾了一个结合yii2-basic和workerman的简单rpc框架。
有兴趣可以帮忙纠正下错误或者疏漏之处,详见github
因为workerman是守护进程的方式,不可避免的遇到了mysql超时断开连接的问题
还是那一套解决方法,重写\yii\db\Command.php
中的execute
和queryInternal
方法,增加重连机制,这部分代码大多数地方都能找到,一切似乎很完美,直到运行起来测试才发现问题。
为了重现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();
}
具体的分析过程可以上看我博客的这篇文章记一次Yii2中Mysql断开重连引起的Invalid parameter number: no parameters were bound错误修复
有疏漏之处欢迎指正,谢谢。
共 0 条回复
xuechaoc
最后登录:2019-05-15
在线时长:0小时48分
- 粉丝0
- 金钱30
- 威望0
- 积分30