programing

PHP+MongoDB: 'No sheat file or directory' 메시지와 함께 'MongoCursorException'이(가) 발견되지 않았습니다.

testmans 2023. 6. 29. 19:53
반응형

PHP+MongoDB: 'No sheat file or directory' 메시지와 함께 'MongoCursorException'이(가) 발견되지 않았습니다.

저는 PHP에서 MongoDB 데이터베이스에 연결하려는 웹 애플리케이션을 작업하고 있습니다.페이지 로드의 90%에서는 모든 것이 정상적으로 작동하지만 나머지 10%에서는 컬렉션을 업데이트하려고 하면 다음과 같은 예외가 발생합니다.

Fatal error: Uncaught exception 'MongoCursorException' with message 'No such file or directory' in D:\webDev\webSites\str\dev3\_global_classes\User.php:40
Stack trace:
#0 D:\webDev\webSites\str\dev3\_global_classes\User.php(40):
   MongoCollection->update(Array, Array, Array)
#1 D:\webDev\webSites\str\dev3\_init\_init.php(8):
   User->__construct(NULL)
#2 D:\webDev\webSites\str\dev3\index.php(3):
   include('D:\webDev\webSi...')
#3 {main} thrown in D:\webDev\webSites\str\dev3\_global_classes\User.php on line 40

PHP 코드:

public function __construct($SESSIONID = null) {        
    User::$_users_collection = Main::$_mongo->selectCollection("users");

     ...   

    $query = array('session_id' => session_id());

    $expiry = time() + Main::$_lifetime;
    $data = array(
        'session_id' => session_id(),
        'expiry' => (string)$expiry,
        'ip' => $_SERVER['REMOTE_ADDR']
    );

    $options = array(
        'upsert' => true,
        'safe' => true
    );

    try {
        User::$_users_collection->update($query, array('$set' => $data), $options);
    } catch (Exception $e) {
        throw $e;
    }

    ...
}

Mongo 버전:

Wed Oct 17 10:53:48 /usr/bin/mongos db version v2.0.7, pdfile version 4.5 starting (--help for usage)
Wed Oct 17 10:53:48 git version: 875033920e8869d284f32119413543fa475227bf
Wed Oct 17 10:53:48 build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41

내 mongo 클러스터에는 하나의 샤드만 있고, 내 php 버전은 5.4.4, 내 mongo 드라이버 버전은 1.2.12입니다.

다음을 사용하여 오류 코드 $e->getCode()를 확인합니다.

    try {
        User::$_users_collection->update($query, array('$set' => $data), $options);
    } catch (MongoCursorException $e) {
    echo "error message: ".$e->getMessage()."\n";
    echo "error code: ".$e->getCode()."\n";
    }

그리고 오류 코드로 Mongo Cursor 예외 오류 목록을 확인합니다. http://www.php.net/manual/pt_BR/class.mongocursorexception.php

예를 들어 오류 코드 3이 표시된 경우 "RAM이 부족하거나 다른 비정상적인 상황이 발생했음을 나타낼 수 있습니다.

참고: 안전 옵션을 사용하지 마십시오. 사용하지 마십시오.Write Concern 옵션을 사용하면 더 많은 옵션도 마찬가지입니다.

오류 정보: "커서에 잘못 접속하거나, 회신을 받는 오류로 인해 발생합니다.데이터베이스에 정보를 보내고 응답을 기다리는 모든 작업은 MongoCursorException을 발생시킬 수 있습니다.유일한 예외는 새 MongoClient()(새 연결 만들기)입니다. 이 경우 MongoConnection만 느려집니다.예외.(http://php.net/manual/en/class.mongocursorexception.php)

어디서 발생하는지 알기 어렵지만, 이 페이지는 이 예외를 발생시킬 수 있는 원인을 자세히 설명합니다.

PHP.ini에 Mongo DB 라이브러리를 설치할 수 없습니다.

창용

http://www.php.net/manual/en/mongo.installation.php#mongo.installation.windows https://s3.amazonaws.com/drivers.mongodb.org/php/index.html

리눅스용

http://www.php.net/manual/en/mongo.installation.php#mongo.installation.nix

이것은 PHP를 통해 mongodb를 실행하는 데 도움이 됩니다.

아마도 PHP Mongo Client가 실제 MongoDB에 연결하는 동안 오류가 발생할 수 있습니다.

다른 곳(groups=#!topic/mongodb-user/wqCNQgiJAQ의 https://groups.google.com/forum/ ?)에서 언급한 것처럼 VMWare를 통해 MongoDB를 실행하면 때때로 연결 문제가 발생할 수 있습니다.

나는 이 오류를 꽤 많이 보았는데, 그것은 다음과 같습니다.

MongoDB는 커서 반복 중에 시간 초과가 발생하면 커서 예외를 발생시킵니다.즉, 큰 데이터 세트에 대해 Mongo에서 쿼리를 실행하면 커서를 할당합니다.그런 다음 커서 위에서 반복하여 한 번에 하나씩 결과를 검색합니다. 이는 일반적인 커서 동작입니다.그러나 충분한 시간이 지난 후에도 여전히 결과를 검색하는 경우 위와 같은 메시지가 표시됩니다.

이에 대한 해결책은 다음 두 가지가 될 수 있습니다.

  • (애플리케이션 계층) 결과를 임시 컬렉션으로 검색하고 그 위에 반복합니다(못생김).
  • (연결 계층) 쿼리하기 전에 시간 초과를 더 높게 설정합니다(가능하다고 가정하는 것이 훨씬 좋습니다).

결과는 다를 수 있습니다. 행운을 빕니다.

언급URL : https://stackoverflow.com/questions/13274910/phpmongodb-uncaught-exception-mongocursorexception-with-message-no-such-fil

반응형