Codeigniter и MongoDb избегают открытия нескольких соединений

0

Я использую Codeigniter, и каждый раз, когда я обновляю свою индексную страницу, мое приложение открывает новое соединение. Я попробовал Singleton мой класс подключения, но он продолжает открывать новое соединение.

Mongolib.php

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;
  }
}

Когда я попробовал Singleton:

MongoDB.php (в папке 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 (в папке библиотеки)

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

Теги:
codeigniter
codeigniter-2

2 ответа

0

Драйвер MongoDB сам управляет пулом соединений. Для каждого запроса открывается соединение. Предполагается, что это так, поскольку серверные курсоры привязаны к соединению, которое оно создало.

Соединения сохраняются в течение определенного промежутка времени (точнее, MongoClient connectTimeoutMS или PHP default_socket_timeout, в зависимости от того, что произойдет раньше), в котором они могут быть повторно использованы, но иногда это не так, например, если они неправильно помечены как не используемые больше. Вы должны исследовать здесь.

Причиной такого поведения является то, что настройка TCP-соединения добавляет достаточно некоторую задержку в запрос, тем более, что при использовании аутентификации.

Соединение довольно дешево со стороны сервера: 1 МБ памяти стека, плюс некоторые k накладных расходов. Монгод предназначен для работы с некоторыми соединениями. Несколько сотен не являются необычными в типичной производственной среде.

НТН.

0

Синглтон не превышает жизненный цикл запроса. То, что вы ищете, это http://php.net/manual/en/features.persistent-connections.php. Я бы прочитал эту страницу и ознакомился с рабочим процессом. Кроме того, похоже, что вы используете более старый драйвер mongo db. Ознакомьтесь с этим здесь для получения информации, связанной с вашей проблемой. Http://php.net/manual/en/mongo.connecting.persistent.php. В целом отредактируйте свое соединение, чтобы посмотреть что-то вроде этого...

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

Глядя на документацию далее здесь http://php.net/manual/en/class.mongoclient.php persistant на самом деле суппозирует значение true/false... Я не уверен, почему они используют "x", который будет конвертировать к истине, поскольку это свернутый пример. Я бы проверить и посмотреть, если...

array("persist" => true);

работает, так как это гораздо более чистый код для чтения.

  • 0
    Я использую драйвер Монго 1.6.0. « Если вы используете версию 1.2.x (но не 1.3.x или более позднюю), обратитесь к MongoPool для получения дополнительной информации о пуле » ( php.net/manual/en/mongo.connecting.persistent.php ). А в классе MongoPool « Предупреждение. Текущие (1.3.0+) выпуски драйвера больше не реализуют пул. Поэтому этот класс и его методы устарели и не должны использоваться ». ( php.net/manual/en/class.mongopool.php )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню