用户已经拥有超过'max_user_connections'的活动连接

时间:2012-06-30 22:36:05

标签: php mysql database mysqli

我有几乎所有类都在扩展的db类:

class db {

    protected $db;

    public function __construct() {
        $this->connect();
    }

    protected function connect() {
        $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error); (line 22)
        $this->db->set_charset('utf8');
    }

}

这是页面类

class page extends db {
    var $common;

    public function __construct() {
        parent::__construct();
        $this->common = new common();

class common extends db {

    public function __construct() {
       parent::__construct();
    }

我正在

  

警告:mysqli :: mysqli()[mysqli.mysqli] :( 42000/1203):用户管理员   已经有超过'max_user_connections'的活动连接   第22行/home/tural/public_html/incl/classes/class.db.php

如何解决此问题?

2 个答案:

答案 0 :(得分:4)

从实例化的db继承的每个类都会建立一个新的数据库连接。您应该只有一个数据库类实例。所有pagecommon都不需要从中继承,只需传递db个实例。

答案 1 :(得分:0)

扩展db类时,每次生成实例后都会建立一个mysqli连接。我认为如果将类db定义为singleton

会更好

代码如下;

class db {

    private static $_db; // db instance
    protected $connection;

    private function __construct() {
        $this->connection = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->connection->error); 
        $this->connection->set_charset('utf8');
    }

    public function get_instance()
    {
        if( isset( self::$_db) )
        {
           return self::$_db;
        }
        else
        {
           self::$_db = new db();            
        }

        return self::$_db;
    }

}

通过这种方式,您只能创建1个mysql连接。

您可以通过db::get_instance()->do_something();

访问db class

普通类可以是这样的;

class page  {
    var $common;
    var $db;    

    public function __construct() {
        parent::__construct();
        $this->db = db::get_instance();
        $this->common = new common();
    }
}

我认为这是更好的设计。