2014-02-10 62 views
0

我已经从mysqli类中扩展了我的数据库模型,但我不希望它每次重新连接时都会实例化一个新模型,因为它确实会减慢整个脚本的速度。如何检查PHP中是否存在活动的MySQLi连接?

我有一个Database类从mysqli延伸,并且其它模型类Database延伸。

Database类看起来是这样的:

class Database extends mysqli { 

    // some properties ... 

    public function __construct() { 
     parent::__construct(MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DATABASE); 
     $this->set_charset(MySQL_CHARACTER_SET); 

     // initializing stuff ..    
    } 

    // some other methods...  
} 

样本模型类是这样的:

class User extends Database { 
    protected $table = "users"; 

public function __construct($id = null) { 
    // Calling the parent constructor. 
    parent::__construct(); 
    if($id) { 
     // This is the current logged-in user. 
     // Importing all session data into this object. 
     $this->data->import($this->session->all()); 
     // ^^ This imports all the user related session data into this object 
     // i don't think it's relevant but i'll leave it here just in case. 
    }     
} 

我的问题是,

  • 我如何检查有一个活动的mysqli连接?

  • 我该如何防止它重新连接并使用活动连接呢?

  • 我可以遵循哪些其他方法?

  • 我应该迁移到PDO,我必须吗? 为什么?

P.S:迁移到PDO将是大量的返工,因为我已经建了的事情库MySQLi。

回答

1
  • 如何检查是否有积极的mysqli连接?

您可以使用mysqli::ping()方法检查连接是否处于活动状态。

这是php.net

if ($mysqli->ping()) { 
    printf ("Our connection is ok!\n"); 
} else { 
    printf ("Error: %s\n", $mysqli->error); 
} 
  • 我怎样才能防止它重新连接,使用主动连接呢?

正如其他答案所说,使用持久连接将解决您的问题。将p:前缀添加到您的主机名称。

parent::__construct("p:" . MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DATABASE); 
  • 我可以遵循什么其他办法?

你可以考虑使用PDO来代替,但如果你并不需要支持其他类型的数据库,或者准备语句的mysqli看起来更加轻盈给我。

+0

谢谢你的详细解答。我接受你的。 –

1

当连接到数据库时,可以在主机名之前放置p:以启动持久连接。像,p:mysite.comp:localhost。这可能与速度的帮助(如果你还没有这样做的话)

+0

谢谢您的回答!我刚刚尝试过,它让一切都变得更快。如果你能为我的其他问题提供答案,我会接受你的答案。 –

+0

欢迎您!如果此答案适用于您,请将其标记为正确答案。谢谢! – SyntaxLAMP

1

试试这个:

parent::__construct("p:".$host, MySQL_USER, MySQL_PASS, MySQL_DATABASE); 
+0

我很抱歉,但我没有使用程序方法。这也是@SyntaxLAMP建议的。工作正常,但对我的问题还不够。谢谢。 –