2016-06-16 3 views
1

코드 발견되지MongoCursorException 커서 (MongoDB를 PHP 드라이버)

Fatal error: Uncaught MongoDB\Driver\Exception\RuntimeException: Cursor not found, cursor id: 31837896248 in ...

이 커서 밖으로 존재하지만 배 않는 것 같다? 어떻게 그 일이 일어나지 않도록 할 수 있습니까? 내가 뭘하려 :

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

을하지만 그 Call to undefined method MongoDB\Driver\Cursor::immortal() 결과

편집은를 추가합니다.

+0

오류합니까 사용할 수있는 모든 옵션을 볼 수 있도록

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

find() 방법은 Find 클래스 생성자의 두번째 인수를 전달합니다 첫 번째 실행에 나타나거나 있습니다 일부 항목을로드 할 수 있습니까? – cb0

+0

DB에서 꽤 많은 문서를 가져 오지만 어느 시점에서는 시간이 초과됩니다. 나는 이것을 일시적으로 무시할 수 있었다.'mongod --setParameter cursorTimeoutMillis = 9000000' – 3zzy

답변

3

에 한번 이런 식으로 쿼리 : 당신이 here

1

Cursor exception

드라이버는 데이터베이스에서 더 많은 결과를 가져 오기 위해 노력했다,라고하지만, 데이터베이스 쿼리의 기록을 가지고 있지 않았다. 이는 대개 커서가 서버 측에서 시간 만료되었음을 의미합니다. 몇 분 동안 사용하지 않으면 데이터베이스가 커서를 종료합니다.

MongoDB를 PHP 드라이버는 두 개의 서로 다른 시간 제한이 있습니다

  1. 연결 시간 제한
  2. 커서 제한 시간

커서에 시간 제한 또는 불멸을 사용하십시오 :

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

참고 : Timeout은 클라이언트 sid에서 대기 할 시간을 나타냅니다. e를 입력하고 immortal은 커서를 서버 측에 설정합니다.

하지만 빅 데이터 크기의 커서가 다음과 같은 덩어리에 커서 데이터를 페치 경우 내가 제안 : 컬렉션에서

받기 처음 1000 개 문서, 공정 그들. 그런 다음 다음 1000 건의 문서를 준비하십시오. 건너 뛰고 제한하여이 작업을 수행 할 수 있습니다.

+1

모든 것을 시도했다. 'immongal'과'timeout'은'mongo'가 아닌 새로운 PHP 드라이버 인'mongodb'에서 사용할 수없는 것으로 보입니다. – 3zzy

+0

사용중인 mongodb 버전은 무엇입니까? find()에서 cursor 객체를 얻고 있습니까? 어떤 PHP 몽고 드라이버가 있습니까? @ 3zzy –