我昨天更新了我的CentOS
机器(包括php 5.6.5和php-pecl-mongo 1.6.0.1)。
从那以后yii2-mongodb再也找不到记录了。
花了整个上午的测试并试图找出它并且归结为:
我直接向mongodb
拨打电话。由于我使用通过Yii
获得的集合句柄,因此我知道ActiveRecord
类也具有mongodb
的有效句柄。任何超过ActiveQuery
/ ActiveRecord
实施的内容都会失败。我无法弄清楚原因。
我已经根据虚拟类组装了一些测试场景,试图消除尽可能多的开销:
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
。< / p>
我们非常感谢任何帮助,我不知道该怎么做,而且我的网站每天都有大量的访问时间,目前已被破坏。
编辑:
我刚刚将mongo驱动程序从1.6.0-1
降级回1.5.8-1
并且一切正常再次。因此,新的mongodb
php驱动程序版本或Yii2
与它进行对话的方式存在问题。
答案 0 :(得分:2)
事实证明,MongoDB
中的游标功能存在错误,1.6.1正准备发布。有关详细信息,请参阅this bug ticket。
再一次: 升级到php-pecl-mongo-1.6.0-1