在扩展的mysqli类中缓慢的父:: __构造

时间:2012-05-19 18:48:59

标签: php mysqli

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

环境:

  • 操作系统 - Windows 7 Pro
  • WAMP服务器
  • Apache / 2.2.17(Win32)
  • PHP 5.3.4
  • MySql ver 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 */}
    }
}

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

2 个答案:

答案 0 :(得分: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秒,大大提高了性能。

但是,有一些细节可用于重复使用“脏”连接的不良影响。它们在manual中进行了解释,但这里的简短消息是:对数据库连接和命令保持整洁,并使它们持久化。如果性能是必须的,那么这就是要走的路。

答案 1 :(得分:0)

你正在使用tcp连接吗?可能会有DNS延迟来解决您要连接的主机名,以及可能在mysql端的反向DNS延迟。

e.g。如果您使用的mysql用户帐户是user@example.com,则MySQL必须对您要连接的IP进行反向DNS查找,以查看example.com是否与该IP地址匹配。