Как установить тайм-аут на бесконечность, чтобы избежать MongoCursorTimeoutException в php - PullRequest
11 голосов
/ 06 апреля 2011

Я запускаю скрипт php, который извлекает данные из mongodb.У меня очень большая база данных, и я получаю это исключение .. моя версия 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 ]

20 голосов
/ 01 октября 2013

MongoCursor :: $ timeout = -1;

введите строку выше в своем коде php.это время ожидания для всех запросов.с уважением,

12 голосов
/ 06 апреля 2011

Вот документация для установки времени ожидания для курсора .

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

Метод command не возвращает курсор, он возвращает массив.

Есливзгляните на документацию для командного метода , вы увидите, что на самом деле это просто оболочка для следующего:

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

Это должно заставить вас двигаться в правильном направлении.

5 голосов
/ 13 ноября 2013

Драйвер PHP поддерживает второй аргумент в методе команды для установки времени ожидания.

Это означает, что вы должны сделать следующее:

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

Это должно решить вашу проблему!

2 голосов
/ 04 июня 2013

Я думаю, на первом шаге вы должны проверить, как mongodb работает с вашим запросом

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

И, если необходимо, добавить индексы к указанным полям

db.collection.ensureIndex(...)

И только если ваш запрос оптимален, установите время ожидания: -1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...