Symfony 5 TraceableFirewallListener 非常慢

Symfony 5 TraceableFirewallListener very slow

我对 Symfony 比较陌生。我目前正在使用 Symfony & Docker 开发原型。

今天我通过登录实现了一个 AuthenticationService(像这样:https://symfony.com/doc/current/security.html)。当我现在加载我的应用程序时,服务器响应时间约为 1500 毫秒。如果没有此身份验证,响应时间约为 70 毫秒。

我打开了分析器,"TraceableFirewallListener" 似乎花费了很多时间。 Symfony Profiler Result 我已经尝试过 comman tipps(更改为 prod env,禁用调试)。

我真的不知道为什么要花那么长时间,但我很确定这不正常。我也不想从这里 () 实施 "solution",因为这对我来说似乎是一个非常糟糕的做法。

我的security.yaml在下面。如果您还需要什么,请问我,我会附上。

提前感谢您的帮助

更新

安装了 blackfire 并发现了一些有趣的图表,也许这会有所帮助: https://blackfire.io/profiles/197c3e1c-c53b-4c28-b793-a384fdb90755/graph

security:
  encoders:
    App\Entity\User:
      algorithm: auto

  providers:
    app_user_provider:
      entity:
        class: App\Entity\User
        property: email
  firewalls:
    dev:
      pattern: ^/(_(profiler|wdt)|css|images|js)/
      security: false
    main:
      anonymous: lazy
      provider: app_user_provider
      guard:
        authenticators:
          - App\Security\LoginFormAuthenticator
      logout:
        path: app_logout

  access_control:
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }

为什么我的回复时间这么长?我该如何缩短它?

事实证明,它与Authenticator本身没有任何关系。 Symfony 根本无法使用缓存,这导致每次请求都重新构建/重建 LoginFormAuthenticator。在这种情况下,较长的响应时间可能是由于此服务使用了很多 类 并且重新创建了其中的每一个。

我的解决方法是 1. 将 'var' 文件夹添加到 .dockerignore,因此在构建时该目录不会复制到容器中。其次,我必须删除整个 'app' 文件夹的挂载(其中包含 'var' 文件夹和其中的缓存)。不要忘记 "remount" 必要的文件夹。我认为这个问题首先发生的原因是,我确实在我的主机上创建了 symfony 项目,并且认为一切都必须在容器内。似乎这导致没有使用缓存的权限。

响应时间回到 ~70 毫秒

此问题的另一个原因可能与 WSL 2 上的 运行 Symfony 有关。在我的例子中,我的代码在 Windows 10 上,但使用的是 WSL 命令提示符和 运行 服务器关闭 /mnt/... 目录。这导致了与问题中概述的情况类似的显着放缓。

将存储库直接克隆到 Ubuntu WSL 主文件夹,并像以前一样 运行 服务器,显着减少了请求延迟。