【问题标题】:Class loop creates mysql too many connections类循环创建mysql太多连接
【发布时间】:2013-03-31 00:49:03
【问题描述】:

所以我正在处理很多类...在我将会话类(验证和创建/销毁会话)包含到我的用户类(用户操作、登录、注册等)之前,一切都运行良好。

基本上,我得到一个“mysqli Too many connections!”错误...我认为这是因为我的会话类包含在用户类中,反之亦然:

__用户类的构造:

$this->db = new DB($db);
$this->password = new Password();
$this->session = new Session($db);

$db 只是一个数据库信息数组...

类Session的__构造:

 $this->error = new Error();
 $this->users = new User($db);
 $this->db = new DB($db);

所以你看到它们是如何相互包含的,我认为这就是导致我的连接错误的原因。

【问题讨论】:

  • 你必须消除循环。如果用户创建了一个会话,该会话创建了一个用户,它创建了一个会话,等等......你基本上会杀死你的系统。谢天谢地,在内存不足之前,你已经用完了 mysql 连接槽,但无论哪种方式,你都有一个必须打破的无限循环。
  • 为每个用户创建一个新的数据库句柄是个坏主意。不要这样做。相反,使用persistent connections 的公共连接池。

标签: php mysql oop class mysqli


【解决方案1】:

在会话类中

做

$this->db = $db;

在你的用户类中

$this->session = new Session($this->db);

【讨论】:

    【解决方案2】:

    你必须先创建一个,然后将它传递给另一个的构造函数。

    喜欢:

    会话:

    __construct($db){
      $this->db = $db; //Don't reconstruct
      $this->users = new User($db,$this);
      ...
    }
    

    用户:

    __construct($db,$session){
    ...
      $this->db = $db; //Don't re-construct
      $this->session = $session;
    ...
    }
    

    【讨论】:

      【解决方案3】:

      创建数据库连接不是用户的工作。 (当你想到它时,它没有多大意义,不是吗?)

      相反,在构造函数中请求数据库连接。

      class User {
          public function __construct(DB $db) {
      

      这样,您可以在整个应用程序中重用连接对象。

      【讨论】:

        【解决方案4】:

        如果你创建一个包含两个类的第三个类并在第三个类上运行循环?然后在 UserSession 上运行所有数据库实例?我不知道?

        __用户类的构造:

         $this->password = new Password();
        

        类Session的__构造:

        $this->error = new Error();
        

        __UserSession 类的构造:

        $this->db = new DB($db);
        $this->users = new User($db);
        $this->users = new Session($db);
        

        【讨论】:

          猜你喜欢
          • 2017-12-27
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 2016-02-19
          • 2013-01-13
          • 1970-01-01
          • 2014-07-25
          • 2010-11-15
          相关资源
          最近更新 更多