异常MongoCursorException:无法发送查询:ët§ôï9·H'ﯤ7·ø?u§Ht§ö·Ìu§®u§Ì½u§4e

时间:2012-07-21 13:53:51

标签: php mongodb-php

我正在尝试从我的系统与远程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 manual。 这个错误意味着什么?

聊天中的一个人建议垃圾是指示数据可能不是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

2 个答案:

答案 0 :(得分: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

检查the website for xdebug表示有新版本可用。正如您之前通过禁用xdebug而发现它会影响结果,请尝试更新xdebug扩展并查看它是否有帮助。

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

答案 1 :(得分:0)