3

我在数据库类中扩展 mysqli。我注意到调用父构造函数需要将近 2 秒。我想这可能是我的环境,因为我在部署之前在我的桌面上进行开发。但这对我来说似乎不太可能。

环境:

  • 操作系统 - Windows 7 专业版
  • WAMP 服务器
  • Apache/2.2.17 (Win32)
  • PHP 5.3.4
  • MySql 版本 5.1.53
  • NetBeans IDE 6.9.1

有问题的代码:

class DGMysqliLink extends MySQLi
{
    public function __construct($aDSN)
    {
        // Construct the DSN
        $aDSN['dbhost'] = (empty($aDSN['dbhost']))?ini_get("mysqli.default_host"):$aDSN['dbhost'];
        $aDSN['dbuser'] = (empty($aDSN['dbuser']))?ini_get("mysqli.default_user"):$aDSN['dbuser'];
        $aDSN['dbpass'] = (empty($aDSN['dbpass']))?ini_get("mysqli.default_pw"):$aDSN['dbpass'];
        $aDSN['dbname'] = (empty($aDSN['dbname']))?'':$aDSN['dbname'];
        $aDSN['dbport'] = (empty($aDSN['dbport']))?ini_get("mysqli.default_port"):$aDSN['dbport'];
        $aDSN['dbsock']= (empty($aDSN['dbsock']))?ini_get("mysqli.default_socket"):$aDSN['dbsock'];

        // Instantiate the object by invoking the parent's constructor.
        // This takes nearly 2 seconds
        parent::__construct($aDSN['dbhost'],$aDSN['dbuser'],$aDSN['dbpass'],
                            $aDSN['dbname'],$aDSN['dbport'],$aDSN['dbsock']);

        // If there are any errors, deal with them now
        if($this->connect_error){/* Do some stuff */}
    }
}

为什么调用此构造函数需要这么长时间,我该如何解决?

4

2 回答 2

1

没有办法解决这个问题,这只是 TCP/IP 的开销以及多层客户端和服务器代码相互通信。但是,您可以使用持久连接。它们从 PHP 5.3 开始可用。要激活它们,只需在主机名前加上“p:”,如连接语句中的“p:localhost”。也在 PHP.INI 中启用它:mysqli.allow_persistent = On

除此之外,它都是自动的。

举个例子,我的页面的平均加载时间为 1.3 秒。当我加载了一个主页,进行 4 或 5 次 AJAX 调用来填充表单字段时,这一次很快就跳到了 7 或 8 秒。每个 ajax 调用都意味着一个新的 PHP 脚本,该脚本又与数据库建立了新的连接。好吧,我认为这里的问题很清楚。

使用持久连接允许 PHP 重用已打开的连接,从而节省为每个脚本打开和关闭新连接所花费的所有时间。就我而言,每个连接大约缩短了 1 秒,大大提高了性能。

然而,有一些关于“脏”连接被重用的不良影响的细节。手册中对它们进行了解释,但这里的简短信息是:整理数据库连接和命令,并使其持久化。如果性能是必须的,这就是要走的路。

于 2013-05-22T02:55:54.657 回答
0

你在使用 tcp 连接吗?解析您要连接的主机名可能会出现 DNS 延迟,并且可能会在 mysql 结束时出现反向 DNS 延迟。

例如,如果您使用的 mysql 用户帐户是user@example.com,那么 MySQL 将不得不对您要连接的 IP 进行反向 DNS 查找,以查看是否example.com与该 IP 地址匹配。

于 2012-05-19T19:36:34.620 回答