Я использую 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
Драйвер MongoDB сам управляет пулом соединений. Для каждого запроса открывается соединение. Предполагается, что это так, поскольку серверные курсоры привязаны к соединению, которое оно создало.
Соединения сохраняются в течение определенного промежутка времени (точнее, MongoClient connectTimeoutMS
или PHP default_socket_timeout
, в зависимости от того, что произойдет раньше), в котором они могут быть повторно использованы, но иногда это не так, например, если они неправильно помечены как не используемые больше. Вы должны исследовать здесь.
Причиной такого поведения является то, что настройка TCP-соединения добавляет достаточно некоторую задержку в запрос, тем более, что при использовании аутентификации.
Соединение довольно дешево со стороны сервера: 1 МБ памяти стека, плюс некоторые k накладных расходов. Монгод предназначен для работы с некоторыми соединениями. Несколько сотен не являются необычными в типичной производственной среде.
НТН.
Синглтон не превышает жизненный цикл запроса. То, что вы ищете, это 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);
работает, так как это гораздо более чистый код для чтения.