Ответ 1
MongoCursor:: $timeout = -1;
введите строку выше в вашем php-коде. этот тайм-аут для всех запросов. наилучшим образом,
Я запускаю php script, который извлекает данные из 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']);
}
как установить тайм-аут в бесконечность, чтобы я сделал это исключение?
MongoCursor:: $timeout = -1;
введите строку выше в вашем php-коде. этот тайм-аут для всех запросов. наилучшим образом,
Здесь представлена документация по настройке таймаута на курсоре.
$cursor = $collection->find()->timeout(n);
Метод command
не возвращает курсор, который возвращает массив.
Если вы посмотрите на документацию для метода , вы увидите, что на самом деле это всего лишь оболочка для следующего:
public function command($data) {
return $this->selectCollection('$cmd')->findOne($data);
}
Это должно заставить вас идти в правильном направлении.
Драйвер PHP поддерживает второй аргумент метода команды для установки таймаута.
Это означает, что вы должны сделать следующее:
$value = $db->command(
array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria),
array('timeout' => 10000000000)
);
Это должно решить вашу проблему!
Я думаю, на первый шаг вы должны проверить, как mongodb работает с вашим запросом
db.collection.find(...).explain()
И, если нужно добавить индексы в указанные поля
db.collection.ensureIndex(...)
И только если ваш запрос оптимален, установите тайм-аут: -1