【问题标题】:How to check if there is an active MySQLi connection in PHP?如何检查 PHP 中是否存在活动的 MySQLi 连接?
【发布时间】:2014-02-10 11:38:24
【问题描述】:

我已经从 mysqli 类扩展了我的数据库模型,但我不希望每次实例化一个新模型时它都重新连接,因为它确实减慢了整个脚本的速度。

我有一个从mysqli 扩展的Database 类,以及从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 上构建了一些东西。

【问题讨论】:

    标签: php oop 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,但如果您不需要支持其他 DB 类型,或者准备好的语句 mysqli 对我来说看起来更轻量级。

    【讨论】:

      【解决方案2】:

      当连接到数据库时,你可以在主机名前加上 p: 来启动一个持久连接。比如p:mysite.comp:localhost。这可能有助于提高速度(如果您还没有这样做)

      【讨论】:

        【解决方案3】:

        试试这个:

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

        【讨论】:

        • 对不起,我没有使用程序方法。这也是@SyntaxLAMP 所建议的。工作正常,但不足以解决我的问题。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2023-01-25
        相关资源
        最近更新 更多