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
我昨天更新了我的 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