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

时间:2015-08-13 12:07:53

标签: php mysql

我是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对象(注意还有其他方法,比如添加条目,搜索等),这会打开一个连接。我的问题是这是正常的做事方式吗?当需要进行查询时,每次打开并连接数据库是否有效?

2 个答案:

答案 0 :(得分:1)

在这方面,效率是许多颜色的一个词。通常有两种处理数据库连接的方法:持久连接或非持久连接(最后一个是您现在使用的连接)。这两者都有一些利弊。

持久连接是一种通常在超时或关闭之前不会死亡的连接。优点是PHP和MySQL之间的开销较少,因为连接字符串/请求的发送次数较少。如果您要创建聊天,游戏或类似需要以高频率收听数据库的内容,这可能会很好。缺点可能是您的MySQL服务器具有最大同时允许连接。如果用户要访问您的站点并从您的数据库中提取一些文本等等 - 持久连接将不会有效,因为它将在没有工作的情况下运行"之后可能会限制未来用户的拉动请求。

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

也就是说,如果您的应用程序也不是持久性的,则持久连接将不起作用。 HTTP Web服务器通过在路径上提供资源来工作(例如mywebsite.com/my_files/myfile.php上的myfile.php)。当用户在其浏览器中输入地址时,Web服务器接受请求,查找数据,解释PHP文件,结果,PHP文件中生成的数据将提供给用户。如果您的PHP应用程序未设置为持久性,则请求将在服务后死亡 - 因此:您的MySQL连接已关闭。实际上,此过程还有更多步骤,因为对服务器的请求还会在DNS服务器中查找名称以匹配用于连接的IP地址。

我几乎没有表面,很多人可能会有更多的优点/缺点和宝贵点,但你可以在这里阅读更多有关PHP和持久连接的信息:http://php.net/manual/en/features.persistent-connections.php

此外,这解释了一下网络服务器的工作原理:http://www.serverwatch.com/tutorials/article.php/1407961/Serving-Up-Web-Server-Basics.htm

答案 1 :(得分:0)

我相信mysqli_connect()会跟踪您的连接并避免多次打开相同的连接。