尝试mongodb全局超时等仍然被我的PHP脚本中的find()查询忽略。我想要一个findOne({...})或find({...})查找,并在超时之前等待数据库服务器最多20ms。
如何确保 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.
在 PHP 文档中$timeout以下是游标超时的说明:
导致提取结果的方法引发 MongoCursorTimeoutException 如果查询时间超过 指定的毫秒数。
我相信超时是指在光标上执行的操作(例如 getNext()
)。
不要这样做:
MongoCursor::$timeout=20;
这是调用静态方法,不会对你有任何好处的 AFAIK。
您需要意识到的是,在您的代码示例中,$testFind是 MongoCursor 对象。因此,在您给出的代码片段中,您应该做的是在其他所有内容之后添加它,以便设置$testFind MongoCursor 的超时:
$testFind->timeout(100);
注意:如果要将$testFind作为数组处理,则需要执行以下操作:
$testFindArray = iterator_to_array($testFind);
那个把我扔了一会儿。希望这对某人有所帮助。
注意 readPpreferences 属性。可能的值为:
MongoClient::RP_PRIMARY
MongoClient::RP_PRIMARY_PREFERRED
MongoClient::RP_SECONDARY
MongoClient::RP_SECONDARY_PREFERRED
MongoClient::RP_NEAREST