我正在尝试从我的系统与远程 MongoDB 服务器通信。我使用的代码是这样的
$con_string='mongodb://server_ip:27017';
$m = new Mongo($con_string);
$temp=$m->selectDB("DBName");
try {
$mc=$temp->collection_name->find()->limit(5);
var_dump($mc->info());
var_dump(iterator_to_array($mc));
}
catch (MongoCursorException $e) {
echo "error message: ".$e->getMessage()."</br>";
echo "error code: ".$e->getCode();
}
现在我从 Xdebug 收到以下消息
MongoCursorException: couldn't send query: ët§ôï9·H'ﯤ7·ø?u§Ht§ ö·Ìu§®u§Ì½u§4e
为什么会引发此异常以及为什么异常末尾有垃圾。我不是每次都得到这个例外,而是 6 次中有 5 次。我从 catch 块得到的消息也是
error message: couldn't send query: QY¥ôï9·H§ï³¤7·DCY¥h §
error code: 14
The error code 14 means "C socket error on send."
PHP手册说。这个错误是什么意思?
聊天中的一个人建议垃圾表明数据可能不是 utf8_encoded 但我正在做一个find()
没有标准的简单所以我需要编码什么?
编辑:
为了解决这种情况,我写了这个
function getCursor($conn,$db_name,$coll_name,$query_options=array(),$fields=array(),$cursor_options=array(),$max_tries=0) {
$counter=0;
while(1) {
try {
$cursor=new MongoCursor($conn,$db_name.'.'.$coll_name,$query_options,$fields);
if (array_key_exists('count',$cursor_options))
return $cursor->count();
if (array_key_exists('limit',$cursor_options))
$cursor=$cursor->limit($cursor_options['limit']);
if (array_key_exists('skip',$cursor_options))
$cursor=$cursor->skip($cursor_options['skip']);
if (array_key_exists('sort',$cursor_options))
$cursor=$cursor->sort($cursor_options['sort']);
return $cursor;
}
catch (MongoCursorException $e) {
$counter+=1;
if ($max_tries>0) {
if ($counter>$max_tries)
echo "error message: ".$e->getMessage()."\n";
echo "error code: ".$e->getCode()."\n";
return false;
}
}
}
}
这些函数接受查询参数,然后将查询发送到服务器,如果MongoCursorException
引发,它会再次发送查询。它会这样做$max_tries
。如果$max_tries
设置为 0,它将继续将此查询发送到服务器,直到查询成功。也许这很愚蠢,我应该将其设置为某个固定值,例如 50。成功时,该函数返回光标,除非您在寻找count
并且在这种情况下它返回count