MongoCursorException - 找不到游标(MongoDB PHP驱动程序)

时间:2016-06-16 22:05:30

标签: php mongodb exception cursor timeout

代码

try {
  $documentsFind = $client->$db->$collection->find([
      // query
  ]);
  if ($documentsFind) {
    foreach ($documentsFind as $product) {
    // code...
    }
  }
catch (MongoCursorException $e) {
  echo "error message: ".$e->getMessage()."\n";
  echo "error code: ".$e->getCode()."\n";
}

错误

  

致命错误:未捕获的MongoDB \ Driver \ Exception \ RuntimeException:   找不到光标,光标id:31837896248 in ...

似乎光标确实存在但是超时?我该如何防止这种情况发生?

编辑添加:我尝试过:

 if ($documentsFind) {
    $documentsFind->immortal(true); // keep alive
    foreach ($documentsFind as $product) {
    // code...
    }
  }

但这导致Call to undefined method MongoDB\Driver\Cursor::immortal()

2 个答案:

答案 0 :(得分:6)

尝试这样查询:

$documentsFind = $client->$db->$collection->find([
  // query
], ['noCursorTimeout' => true]);

find()方法将第二个参数传递给Find类构造函数,因此您可以看到所有可用选项here

答案 1 :(得分:0)

Cursor exception说,

驱动程序试图从数据库中获取更多结果,但数据库没有查询记录。这通常意味着光标在服务器端超时:在几分钟不活动后,数据库将终止光标。

MongoDB PHP驱动程序有两种不同的超时:

  1. 连接超时
  2. 光标超时
  3. 确保在光标上使用超时或不朽:

    $cursor = $collection->find();
    $cursor->immortal(true); 
    $cursor->timeout(-1);
    

    注意:Timeout表示在immortal设置服务器端光标时在客户端等待的时间。

    但我建议如果你有大数据大小的光标,那么你应该在块中获取光标数据,如:

    从集合中获取前1000个文档,进行处理。然后获取下一个1000个文档。您可以通过跳过和限制来完成此操作。