Codeigniter和MongoDb避免打开多个连接

时间:2014-11-08 00:18:25

标签: php mongodb codeigniter codeigniter-2

我正在使用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

2 个答案:

答案 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&#39; s connectTimeoutMS或PHP default_socket_timeout,以先发生者为准),其中< em>可以重复使用,但有时候不会,例如,如果没有正确标记为不再使用。你应该在这里调查。

这种行为的原因是设置TCP连接会给请求增加一些延迟,如果涉及身份验证则更是如此。

从服务器端连接相当便宜:1MB的堆栈内存,加上一些k的开销。 mongod旨在处理相当多的连接。在典型的生产环境中,几百个并不罕见。

HTH。