Symfony防火墙在做什么,花了这么长时间?

2022-08-30 09:31:49

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

Profiler timeline

请注意,它只是说“防火墙”250毫秒。我认为防火墙只是负责将用户排除在页面的某些区域之外 - 我无法想象这需要超过几毫秒的时间加上从数据库获取用户信息所需的时间(在本例中为61毫秒)。

有人可以解释防火墙实际上做了什么吗?如果您有关于如何提高防火墙性能的任何一般指针,那将不胜感激。


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


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


答案 1

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

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

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


答案 2

唉,事实证明Radreeg部分是对的。我做了一个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";

输出为:

Connection took 230.18503189087 ms
Query took 64.532995223999 ms

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

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


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


推荐