PDO在PHP 5.4和Apache 2.4.3上运行缓慢。

4

可能是重复问题:
在Windows平台上使用mysql_connect (localhost / 127.0.0.1)

我刚刚升级了开发机上的Apache和PHP版本,PDO完全崩溃了。

这是一个非常简单的PDO类:

class PDO_DBH {
    public static function openSesame() {
        echo '<p>start openSesame: </p>'.microtime(true);
        $db_username = 'root';
        $db_password = 'pass';
        try {
            $dbh = new PDO('mysql:host=localhost;dbname=DB_NAME', $db_username, $db_password);
            $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            echo '<p>end successful openSesame: </p>'.microtime(true);
            return $dbh;
        } catch (PDOException $e) {
            echo '<p>end failed openSesame: </p>'.microtime(true);
            return 'PDO database access error!';
        }
    }
}

在升级之前,以及其他开发机器上,一个典型的页面加载时间为一秒钟,最多两秒钟。
现在,通过神奇的microtime(true),我发现每个连接的打开需要大约一秒钟的时间。
一个典型的页面可能会创建一个新的$dbh,然后将其20次$dbh = null;作为不同的对象和方法检索他们需要的数据。这在其他机器或我的Web主机上从未成为问题。
我错在哪里了?

4
如果您连接到 127.0.0.1 而不是 localhost,会有什么影响呢?我敢打赌这应该会有所帮助;-) - zerkms
你可能希望禁用MySQL的反向DNS检查 - El Yobo
1
@AndrewHeath,我建议您使用throw $e;而不是返回错误字符串。千万不要丢弃异常。另外,请问这个操作系统是什么? - Phil
1
@Phil - 关于 $e,我在剪切和粘贴代码时简化了它,因为我认为那一部分并不重要,实际脚本中我已经有一个处理程序了。感谢你的关心。 :-) - Drew
1
@AndrewHeath 这就是为什么它很重要 - https://dev59.com/X2gu5IYBdhLWcg3wASWO。这是另一个解决方案 - http://www.php.net/manual/en/function.mysql-connect.php#94316 - Phil
显示剩余3条评论
1个回答

4

这只是一个猜测,但在Windows机器上,改为使用127.0.0.1而不是localhost就可以解决问题。


问题在于尝试解析“localhost”。Windows太蠢了。 - Phil
@Phil:但是localhost在“hosts”中,应该始终被缓存。所以它不应该立即解析吗? - zerkms
是的,但在Windows上它出现了两次。一次是为了127.0.0.1,另一次是为了::1。问题在于它首先尝试IPv6地址并尝试通过该地址连接(MySQL未在其上侦听)。 - Phil
尝试了hosts文件但没有成功。然而,在PHP代码中将localhost参数替换为127.0.0.1作为**mysql_connect()**函数的参数就可以解决问题了。无法想象DNS解析在微软平台上多年来仍存在性能问题。它也影响到了dot net框架的项目。 - Ken Pega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接