0

我正在尝试从我的系统与远程 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

4

2 回答 2

1

你的字符串看起来像这样,如果:

  • 您有字符集编码问题
  • 内存坏了

由于在您的代码中涉及的字符串不多,因此这是编码问题的可能性不是很高。

但是由于 Xdebug 是一个 PHP 扩展,它处理了很多内部问题,因此破坏内存可能是一回事。

找出问题的一个简单方法是禁用您怀疑导致问题的扩展,例如 xdebug。

它对于文档目的也很有用 tp 写下您正在使用的 PHP 和扩展版本以及在哪个操作系统上。我在评论中要求,它是一个类似的列表:

PHP 5.3.10
Mongodb Extension 1.2.10
Mongodb Server 2.0.6
Xdebug 2.2.0    
Centos 6.2 64-bit

检查网站的 xdebug表明有一个新版本可用。正如您之前通过禁用 xdebug 发现它会影响结果一样,请尝试更新 xdebug 扩展并查看它是否有帮助。

即使是这样,请保留您的版本列表以供进一步参考(以及对问题的简短描述),因为如果升级后问题没有完全解决,此信息在以后执行时非常有用有用的错误报告。软件中的那些内部问题有时很难发现,因此这些信息有助于更容易地重现或识别所涉及的区域。

于 2012-07-22T07:01:50.073 回答
0

这在 Mongo 驱动程序 v1.3+ 中已修复

参考:https ://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/IJ1n_Xt_al8

下载:http ://docs.mongodb.org/ecosystem/drivers/

于 2013-04-22T05:07:26.950 回答