2014-11-08 2 views
0

Codeigniter를 사용하고 색인 페이지를 새로 고칠 때마다 응용 프로그램이 새 연결을 엽니 다. 내 연결 클래스를 Singleton하려고했지만 새로운 연결을 계속 열어. Mongolib.phpCodeigniter와 MongoDb는 다중 연결을 열지 않습니다.

class Mongolib extends MongoClient 
{ 
    var $db; 

    public function __construct() 
    { 
     $ci =& get_instance(); 

     $ci->load->config('mongo'); 

     $server = $ci->config->item('mongo_server'); 
     $dbname = $ci->config->item('mongo_dbname'); 

     if ($server) 
     { 
      parent::__construct($server); 
     } 
     $this->db = $this->$dbname; 
    } 
} 

난 싱글을 시도하는 경우 :

(THIRD_PARTY 폴더)

class MongoApi { 

    static protected $_instance; 

    protected $db = null; 

    final protected function __construct() { 
     $m = new MongoClient(); 
     $this->db = $m->selectDB("mydb"); 
    } 

    static public function getInstance() { 
     if (!(self::$_instance instanceof self)) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection() { 
     return $this->db; 
    } 

    final protected function __clone() { } 
} 

Mongolib.php (라이브러리

MongoDB.php 폴더)

require MY_PATH . '/application/third_party/MongoDB.php'; 
    class Mongolib 
    { 
     var $db; 

     public function __construct() 
     { 
      $this->db = MongoApi::getInstance()->getConnection(); 
     } 

    } 

난 내 페이지를 새로 고침하고 새 연결을 엽니 다) db.serverStatus를 (실행 ...

"connections" : { 
    "current" : 4, 
    "available" : 2044, 
    "totalCreated" : NumberLong(7) 
}, 

몽고 드라이브 버전 - 1.6.0-dev에

답변

0

싱글 톤 요청 수명주기보다 오래 가지 않습니다. 당신이 찾고있는 것은 http://php.net/manual/en/features.persistent-connections.php입니다. 나는 페이지를 읽고 워크 플로우에 익숙해 질 것이다. 또한 이전 mongo db 드라이버를 사용하고있는 것처럼 보입니다. 문제와 관련된 정보는 여기에서 읽어보십시오 http://php.net/manual/en/mongo.connecting.persistent.php. 전부 "그들이 사용하는 이유는 확실하지 않다 ... 더 여기 http://php.net/manual/en/class.mongoclient.php들이 지속적인 실제로 참/거짓 값을 수 supose됩니다

new MongoClient("mongo_server", array("persist" => "x")); 

이 문서를 보면 ... 이런 식으로 뭔가를보기 위하여 당신의 연결 편집 x "는 복잡한 예입니다. 나는 체크하고 볼 것인가 ...

array("persist" => true); 

이것은 매우 깨끗한 코드입니다.

+0

mongo 드라이버 1.6.0을 사용하고 있습니다. "_1.x.xx (1.3.x 이후 버전이 아님)를 사용하는 경우 pooling_에 대한 자세한 정보는 MongoPool을 참조하십시오."(http://php.net/manual/en/mongo.connecting.persistent.php).그리고 MongoPool 클래스에서 "_Warning 드라이버의 현재 (1.3.0+) 릴리스는 더 이상 풀링을 구현하지 않으므로이 클래스와 메서드는 더 이상 사용되지 않으므로 사용해서는 안됩니다." (http://php.net/manual/en/class.mongopool.php) –

0

MongoDB 드라이버 자체가 연결 풀을 관리합니다. 모든 요청에 ​​대해 연결이 열립니다. 그것은 서버 쪽 커서가 생성 한 연결에 첨부되어 있기 때문에 그렇게해야합니다.

연결

는 일정 시간 동안 계속 살아있다,하는 그들은 재사용 할 수 (중 먼저 도래 MongoClient의 connectTimeoutMS 또는 PHP의 default_socket_timeout, 정확합니다), 그러나 때때로, 예를 들어,하지 더 이상 사용하지 않는 것으로 올바르게 표시되지 않았습니다. 여기서 조사해야합니다.

이 동작의 이유는 TCP 연결을 설정하면 요청에 상당한 지연이 추가되고 인증이 관련 될 경우 더욱 그렇습니다.

연결은 서버 쪽에서 다소 저렴합니다. 1MB의 스택 메모리와 약간의 오버 헤드가 추가되었습니다. mongod는 꽤 많은 연결을 처리하도록 설계되었습니다. 일반적인 프로덕션 환경에서는 2 백 개가 이상하지 않습니다.

HTH.

관련 문제