繁体   English   中英

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

[英]Better way to keep mysql connection alive other than pinging

我确信很多开发人员都遇到了可怕的“ 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。

我不能确定这是否是发生在随机出现问题的实时服务器上的情况,但这是我能够重现此问题的唯一方法。

实际上, Server Has Gone Away原因有很多,在MySQL文档中Server Has Gone Away对此进行了充分说明。 几个常见的技巧可以尝试:

  • 增加my.cnf文件中的wait_timeout 如果您的锁需要保持较长时间,请参见innodb_lock_wait_timeoutlock_wait_timeout

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

  • 增加my.cnf文件中的max_allowed_pa​​cket 大型数据包可能会使连接断开,并导致其突然关闭。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM