除了ping之外,保持mysql连接活动的更好方法

时间:2016-07-21 19:31:17

标签: php mysql pdo yii

我确信很多开发人员遇到了可怕的“Mysql已经消失”的问题,特别是在处理长时间运行的脚本时,例如那些为后台或cron作业保留的脚本。这是由mysql和php之间的连接被删除引起的。究竟什么是防止这种情况发生的最佳方法?

我目前直接使用带有setActive方法的自定义CDbConnection类:

http://www.yiiframework.com/forum/index.php/topic/20063-general-error-2006-mysql-server-has-gone-away/page__p__254495#entry254495

这很有效,并且已经停止了我的MySQL消失问题。不幸的是,我遇到了一个非常随机的问题,在通过CActiveRecord将新记录插入数据库之后,yii无法正确设置主键值。最终你的pk值为0.我更深入地研究了这个问题,并最终能够在我的本地机器上重现它。看起来我的自定义CDbConnection :: setActive()方法可能是罪魁祸首。当您运行CActiveRecord :: save()方法时,yii准备必要的sql并通过PDO执行它。紧接着,yii使用PDO :: lastInsertId()来获取最新插入的ID并填充模型PK属性。如果由于某种原因,初始插入命令需要几秒钟才能完成,会发生什么?这会在我的自定义setActive()方法中触发mysql ping操作,该方法仅等待当前时间戳与上一个活动时间戳之间的2秒差异。我注意到当你执行PDO插入查询,然后是PDO选择查询,然后最后是PDO :: lastInsertId()时,最后插入的id值为0。

我不能确定这是否是我们的实时服务器上发生的问题,这些服务器随机发生,但这是我能够重现它的唯一方式。

1 个答案:

答案 0 :(得分:0)

Server Has Gone Away错误实际上有很多原因,这些错误在MySQL文档中有详细记载。一些常见的尝试是:

  • 增加 my.cnf 文件中的wait_timeout。如果您的锁需要保持锁定更长的时间,请参阅 innodb_lock_wait_timeout lock_wait_timeout
      

    服务器在关闭非交互式连接之前等待活动的秒数。

  • my.cnf 文件中增加max_allowed_packet。大数据包可能会使连接跳闸并导致其突然关闭。
      

    如果使用大型BLOB列或长字符串,则必须增加此值。它应该与您想要使用的最大BLOB一样大。 max_allowed_pa​​cket的协议限制为1GB。该值应为1024的倍数; nonmultiples向下舍入到最接近的倍数。