使用PHP访问MySQL数据库,我可以保持连接打开吗?

使用PHP访问MySQL数据库,我可以保持连接打开吗?,php,mysql,Php,Mysql,我对PHP和MySql相当陌生。我已经编写了一个简单的API来操作我的数据库 处理程序类如下所示: class DbHandler { protected static $conn; function __construct() { if(!isset(self::$conn)) { $this->connect(); } } function __destruct() {

我对PHP和MySql相当陌生。我已经编写了一个简单的API来操作我的数据库

处理程序类如下所示:

class DbHandler {

    protected static $conn;

    function __construct() {


        if(!isset(self::$conn)) {

            $this->connect();
        }

    }

    function __destruct() {

        self::$conn->close();


    }

    function connect() {


        $config = parse_ini_file('../../config.ini');

        // Try and connect to the database
        self::$conn = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);


        if(self::$conn===FALSE) {

            header("HTTP/1.1 500 Internal Server Error");
            header("Content-Type: application/json");
            $response = array("Response"=>"Failed to connect to the database");
            echo json_encode($response);
            die();

        }


    }
}

每次查询数据库时,我都会创建这个DbHandler对象(注意,其中还有其他方法,如addentry、search等),用于打开连接。我的问题是这是正常的做事方式吗?当需要进行查询时,每次打开并连接数据库是否有效?

我相信
mysqli\u connect()
将跟踪您的连接,避免多次打开同一连接。

在这方面,效率是一个多姿多彩的词。通常有两种处理数据库连接的方法:持久连接或非持久连接(最后一种是您现在使用的)。两者都有一些优点和缺点

持久连接是一种在超时或关闭之前通常不会消亡的连接。优点是PHP和MySQL之间的开销更小,因为连接字符串/请求的发送次数更少。如果你想创建一个聊天室,一个游戏或者类似的东西,需要在高频率上收听数据库,这可能会很好。缺点可能是,如果您的MySQL服务器具有允许的最大同时连接数。如果用户要访问您的站点并从您的数据库中提取一些文本等,那么持久连接将不会有效,因为它将在之后“无任务运行”,因此可能会限制未来用户的提取请求

非持久性连接,正如您现在可能已经猜到的那样,一旦PHP请求运行,该连接就会消失。如果您在此处再次进行聊天/游戏,并且希望在X毫秒内得到响应,那么开销(连接请求)可能会导致延迟,因为响应会延迟,最终会延迟整个算法。在这种情况下,这种权衡可能类似于允许的最大用户数与PHP和MySQL服务器之间的实时数据访问

也就是说,如果您的应用程序不是持久的,那么持久连接将无法工作。HTTP Web服务器通过在路径上提供ressource(例如mywebsite.com/my_files/myfile.php上的myfile.php)来工作。当用户在浏览器中输入地址时,Web服务器接受请求,查找数据,解释PHP文件,结果,从PHP文件生成的数据被提供给用户。如果您的PHP应用程序没有设置为持久化,那么请求一旦被服务就会消失——因此:您的MySQL连接被关闭。实际上,此过程还有更多步骤,因为对服务器的请求也会在DNS服务器中查找名称,以匹配用于连接的IP地址

我只是粗略地描述了表面,很多人可能对此有更多的优点/缺点和有价值的观点,但是您可以在这里阅读更多关于PHP和持久连接的内容:


此外,这还解释了一些Web服务器的工作原理:

谢谢您的回答,这是一个很好的答案。我不是在开发聊天应用,也不是在开发任何需要频繁执行数据库命令的应用,所以我想我现在使用的非持久性连接就足够了。非常欢迎您。我也认为非坚持的方式将是你最好的选择。祝你的项目好运。