【发布时间】:2016-07-21 19:31:16
【问题描述】:
我确信很多开发人员都遇到了可怕的“Mysql 已消失”问题,尤其是在处理长时间运行的脚本时,例如为后台或 cron 作业保留的脚本。这是由于 mysql 和 php 之间的连接断开造成的。防止这种情况发生的最佳方法究竟是什么?
我目前直接使用自定义 CDbConnection 类和 setActive 方法:
这很有效,并阻止了我的 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。
我不能确定这是否是我们的实时服务器上发生的问题,随机发生的问题,但这是我能够重现它的唯一方法。
【问题讨论】: