61

我的 Symfony 页面并不算太慢(加载时间约为 400 毫秒),但考虑到它只是一个简单的带有基本身份验证的 hello world 页面,加载时间应该不到 100 毫秒。当我进入分析器时,我看到了这个:

探查器时间线

请注意,它只显示 250 毫秒的“防火墙”。我认为防火墙只是负责让用户远离页面的某些区域 - 我无法想象花费超过几毫秒的时间加上从数据库中获取用户信息所需的时间(在这种情况下是61 毫秒)。

有人可以解释防火墙的实际作用吗?如果您对如何提高防火墙性能有任何一般性的指导,我们将不胜感激。


注意:我当然已经用谷歌搜索过了,我想预先指定我通过 IP 地址而不是主机名连接到 MySQL 数据库。这似乎是我能找到的所有其他慢速 Symfony 防火墙的问题。


我的项目中可能相关的一些资源:

4

3 回答 3

13

我做了一些谷歌搜索,我看到这个人,似乎有你问题的答案。

经过 15 分钟的研究,我最终发现这是由于 PHP PDO 构造函数造成的(我的防火墙是第一个连接到数据库的,因为我使用实体作为用户)。有了这些知识,很快就发现了问题([1][2]):事实证明,使用 DNS 名称(如“localhost”)而不是 IP(如“127.0.0.1”)会导致此问题。

对 parameters.yml 文件的简单编辑(将 localhost 更改为 127.0.0.1)可以将防火墙加载时间减少到最低限度。

于 2013-04-24T06:52:08.200 回答
11

唉,事实证明Rawdreeg部分正确。我制作了一个 20 行的 PHP 脚本来分析连接到我的 MySQL 服务器所需的时间:

<?php

$time = microtime(true);

$con = new PDO(...);

$connect_time = microtime(true);

$result = $con->query('SHOW TABLES');

$query_time = microtime(true);

var_dump($result->fetchAll(PDO::FETCH_ASSOC));

$time_con = ($connect_time - $time) * 1000;
$time_query = ($query_time - $connect_time) * 1000;

echo "Connection took $time_con ms\n";
echo "Query took $time_query ms\n";

输出是:

连接耗时 230.18503189087 毫秒
查询耗时 64.532995223999 毫秒

这完美地填补了 Symfony profiler 的空白。好消息是,当我的应用程序上线时,它将通过套接字本地连接到 MySQL 服务器,所以它可能会非常快!但是,除了在本地镜像 MySQL 服务器之外,我对开发过程中的速度几乎无能为力。

所以总结一下答案;Symfony 防火墙最初创建与 MySQL 数据库的连接,在我的情况下,该连接非常慢。就我而言,MySQL 连接时间占防火墙分析时间的 80% 以上。


注意:我已经通过 IP 地址连接到 MySQL 服务器,并且我已经添加skip-name-resolve到 MySQL 配置中无济于事。

于 2013-04-25T20:19:29.990 回答
1

您的 MySQL 服务器可能是问题所在。尝试添加skip-name-resolve到文件的[mysqld]部分my.cnf。这会阻止 MySQL 对传入连接的 IP 地址进行反向 DNS 查找。

于 2013-04-25T14:30:48.613 回答