如何检查PHP中是否存在活动的MySQLi连接?

时间:2014-02-10 11:38:24

标签: php oop mysqli

我已经从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上构建了东西。

3 个答案:

答案 0 :(得分:2)

  • 如何检查是否存在有效 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对我来说看起来更轻量级。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

试试这个:

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