Yii2 mongodb ActiveRecord 自 yum 更新以来总是 returns null,而直接查询有效

Yii2 mongodb ActiveRecord always returns null since yum update, while direct query works

我昨天更新了我的 CentOS 机器(包括 php 5.6.5 和 php-pecl-mongo 1.6.0.1)。 从此 yii2-mongodb 再也找不到记录了。

花了整个上午的时间进行测试并试图找出答案,结果归结为:

我直接打给 mongodb 的每个电话都有效。由于我使用的是通过 Yii 获得的集合句柄,我知道 ActiveRecord classes 也具有 mongodb 的有效句柄。 ActiveQuery / ActiveRecord 实现失败。我不知道为什么。

我已经组装了一些基于虚拟 class 的测试场景,试图尽可能地消除开销:

class Test extends \yii\mongodb\ActiveRecord
{
    public static function collectionName() { return 'PostContent'; }
    public function attributes() { return ['_id', 'postId', 'text', 'title', 'renderedText', 'renderedAt']; }
}
$condition = ['postId' => 5336265];

echo 'Direct:';
var_dump(Test::getDb()->getCollection('PostContent')->mongoCollection->findOne($condition));

echo 'Direct 2: ';
var_dump(Test::getCollection()->mongoCollection->findOne($condition));

echo 'Cursor:';
$cursor = Test::getDb()->getCollection('PostContent')->mongoCollection->find($condition, []);
var_dump($cursor->next());

echo 'ActiveQuery:';
var_dump(Test::find()->where($condition)->asArray()->one());

echo 'findOne:';
var_dump(Test::findOne($condition));

输出是(裁剪了无关紧要的实际结果):

Direct:
<snip - correct result>

Direct2:
<snip - correct result>

Cursor:
<snip - correct result>

ActiveQuery:
null

findOne:
<crash> Invalid argument supplied for foreach() (../yii2/db/BaseActiveRecord.php:1046) 

最后一次崩溃是因为 null 结果实际上通过了检查并且调用了 populateRecord 函数,该函数试图 foreach null 值.

非常感谢任何帮助,我不知道该尝试什么了,而且我有一个每天访问量很大的网站目前已损坏。

编辑: 我刚刚将 mongo 驱动程序从 1.6.0-1 降级回 1.5.8-1 并且 一切正常 。因此,新的 mongodb php 驱动程序版本或 Yii2 与之对话的方式存在问题。

事实证明这是 MongoDB 中游标功能的错误,1.6.1 正在准备发布。详情请参考this bug ticket

所以再次:升级到php-pecl-mongo-1.6.0-1