我正在使用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)
},
Mongo驱动版本 - 1.6.0-dev
答案 0 :(得分: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实际上是一个真/假值......我不确定为什么他们使用“x”将转换为true,因为它是一个复杂的例子。我会检查一下......
array("persist" => true);
可以工作,因为这是更清晰的代码。
答案 1 :(得分:0)
MongoDB驱动程序本身管理连接池。对于每个请求,都会打开一个连接。它应该是这样的,因为服务器端游标附加到它创建的连接上。
连接保持活动一段时间(确切地说是MongoClient' s connectTimeoutMS
或PHP default_socket_timeout
,以先发生者为准),其中< em>可以重复使用,但有时候不会,例如,如果没有正确标记为不再使用。你应该在这里调查。
这种行为的原因是设置TCP连接会给请求增加一些延迟,如果涉及身份验证则更是如此。
从服务器端连接相当便宜:1MB的堆栈内存,加上一些k的开销。 mongod旨在处理相当多的连接。在典型的生产环境中,几百个并不罕见。
HTH。