0

我的 PHP 脚本中的 find() 查询仍然忽略了尝试 mongodb 全局超时等。我想要一个 findOne({...}) 或 find({...}) 查找并在超时前等待数据库服务器最多 20 毫秒。

如何确保 PHP 不将此设置用作软限制?它仍然被忽略并在 5 秒后处理答案。

这是一个 PHP mongo 驱动程序错误吗?

例子:

MongoCursor::$timeout=20;
$nosql_server=new Mongo('mongodb://user:pw@'.implode(",",$arr_replicas).'',array("replicaSet" => "gmt","timeout"=>10)) OR troubles("too slow to connect");
$nosql_db=$nosql_server->selectDB('aDB');
$nosql_collection_mcol=$nosql_db->mcol;
$testFind=$nosql_collection_mcol->find(array('crit'=>123));
//If PHP considered the MongoCursor::$timeout, I'd expect the prev. line to be skipped or throwing a mongo/timeout exception if DB does not return the find result cursor ready within 20ms.
//However, I arrive with this line after seconds, without exception whenever the DB has some lock or delay, without skipping previous line.
4

3 回答 3

0

不要这样做:

MongoCursor::$timeout=20;

那是调用静态方法,不会对您有任何好处。

您需要意识到的是,在您的代码示例中,$testFind MongoCursor 对象。因此,在您提供的代码片段中,您应该在其他所有内容之后添加它以设置$testFind MongoCursor 的超时:

$testFind->timeout(100);

注意:如果您想将$testFind作为数组处理,您需要执行以下操作:

$testFindArray = iterator_to_array($testFind);

那个让我循环了一会儿。希望这可以帮助某人。

于 2014-06-03T19:32:47.217 回答
0

$timeout的 PHP 文档中,以下是游标超时的解释:

如果查询花费的时间超过指定的毫秒数,则导致获取结果的方法抛出 MongoCursorTimeoutException。

我相信超时是指在光标上执行的操作例如 getNext())。

于 2013-11-05T13:05:06.593 回答
0

注意 readPreference 属性。可能的值是:

MongoClient::RP_PRIMARY
MongoClient::RP_PRIMARY_PREFERRED    
MongoClient::RP_SECONDARY
MongoClient::RP_SECONDARY_PREFERRED 
MongoClient::RP_NEAREST
于 2015-09-25T20:07:18.807 回答