2011-04-06 21 views
11

Estoy ejecutando el script php que obtiene datos de mongodb. Tengo una base de datos muy grande y yo estoy haciendo esta excepción ..my versión mongodb es 1.6.5Cómo establecer el tiempo de espera en infinito para evitar MongoCursorTimeoutException en php

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

Mi consulta es como esto

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']); 
    } 

cómo puedo configurar el tiempo de espera a infinito para que yo no obtenga esta excepción

Respuesta

12

Aquí hay documentación para configurar el timeout on a cursor.

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

El método command no devuelve un cursor que devuelve una matriz.

Si se echa un vistazo a la documentación de la command method, verá que en realidad es sólo un envoltorio para lo siguiente:

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

Eso debe conseguir que va en la dirección correcta.

+9

O simplemente: MongoCursor :: $ timeout = -1; – user956584

2

creo, por el primer paso que debe comprobar cómo mongodb trabaja con su consulta

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

Y, si es necesario añadir índices a los campos especificados por

db.collection.ensureIndex(...) 

Y sólo que si la consulta es óptima, ajuste de tiempo de espera: -1

20

MongoCursor :: $ timeout = -1;

escribe la línea superior en tu código php. esto establece el tiempo de espera para todas las consultas. mejor relación,

+0

O puede hacer 'MongoCursor :: $ timeout = $ yourTimeInMS' para establecer el tiempo de espera que desee antes de la consulta. – Marcin

+5

Tenga en cuenta que está obsoleto en> = 1.5 – farzan

+0

Esta fue una buena solución, desafortunadamente no se puede usar con el último controlador php mongo, lo que en realidad causa la salida del script (dependiendo de su configuración del nivel de error) – Dmitri

5

El controlador PHP admite un segundo argumento en el método de comando para establecer el tiempo de espera.

Esto significa que usted debe hacer lo siguiente:

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

Esto debería resolver su problema!

Cuestiones relacionadas