システムからリモートの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