如何将超时设置为无限以避免php中的MongoCursorTimeoutException

时间:2011-04-06 05:37:12

标签: php mongodb mongodb-php

我正在运行从mongodb获取数据的php脚本。我有一个非常庞大的数据库,我得到这个例外..我的mongodb版本是1.6.5

PHP Fatal error:  Uncaught exception 'MongoCursorTimeoutException' 
with message 'cursor timed out 
(timeout: 30000, time left: 0:0, status: 0)

我的查询就像这样

private function executeRegex($start_date, $end_date, $source, $collection, $db)
  {
    $criteria = array(
        'date' => array(
          '$gte' => new MongoDate(strtotime($start_date)),
          '$lt' => new MongoDate(strtotime($end_date))
          ),  
        'uid'=> array(
          '$ne' => '-',
          ),  
        'source' => new MongoRegex($source)
        );  
    $value = $db->command(array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria)); 
    return count($value['values']);
  }

如何将超时设置为无限,以便我不会得到此异常

4 个答案:

答案 0 :(得分:20)

  

MongoCursor :: $ timeout = -1;

在php代码中输入以上行。这个设置超时所有查询。 最好的考虑,

答案 1 :(得分:12)

以下是设置timeout on a cursor

的文档
$cursor = $collection->find()->timeout(n);

command方法不会返回它返回数组的游标。

如果您查看command method的文档,您会发现它实际上只是以下内容的包装器:

public function command($data) {
    return $this->selectCollection('$cmd')->findOne($data);
}

这应该让你朝着正确的方向前进。

答案 2 :(得分:5)

PHP驱动程序在命令方法中支持第二个参数来设置超时。

这意味着您应该执行以下操作:

$value = $db->command(
    array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria),
    array('timeout' => 10000000000)
);

这可以解决你的问题!

答案 3 :(得分:2)

我认为,首先应该检查mongodb如何处理您的查询

db.collection.find(...).explain()

并且,如果需要通过

将索引添加到指定的字段
db.collection.ensureIndex(...)

只有在您的查询最佳时,才设置超时:-1