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ます。が0に設定されている場合$max_tries、クエリが成功するまでこのクエリをサーバーに送信し続けます。たぶんこれはばかげているので、これを50のような固定値に設定する必要があります。成功すると、関数はカーソルを返します。ただし、を探している場合を除き、countその場合はカーソルを返します。count

4

2 に答える 2

1

次の場合、文字列は次のようになります。

  • 文字セットのエンコーディングに問題がある
  • メモリが壊れている

あなたのコードには多くの文字列が含まれていないため、これがエンコーディングの問題である可能性はあまり高くありません。

しかし、Xdebug は PHP の拡張機能であり、多くの内部処理を行うため、メモリを破壊することは問題の 1 つになる可能性があります。

簡単に見つける方法は、xdebug など、問題を引き起こしていると思われる拡張機能を無効にすることです。

また、使用している PHP と拡張機能のバージョン、およびオペレーティング システムを書き留めておくと、文書化の目的にも役立ちます。私はコメントでそれを求めました、それは次のようなリストです:

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

Web サイトで xdebugを確認すると、新しいバージョンが利用可能であることがわかります。xdebug を無効にすることで結果に影響することが以前にわかったので、xdebug 拡張機能を更新してみて、それが役立つかどうかを確認してください。

その場合でも、アップグレードで問題が完全に解決されない場合に備えて、後で参照できるように (問題の簡単な説明とともに) バージョン リストを保管しておいてください。便利なバグレポート。ソフトウェアのこれらの内部問題は特定するのが難しい場合があるため、この情報は、より簡単に再現したり、関連する領域を特定したりするのに役立ちます。

于 2012-07-22T07:01:50.073 に答える