TraceableFirewallListener的加载时间非常长

时间:2019-03-01 10:30:18

标签: symfony symfony-security

在我的一个symfony项目中,最近一直遇到巨大的性能问题,其中的性能问题似乎位于“ Symfony \ Bundle \ SecurityBundle \ Debug \ TraceableFirewallListener”的后面,恰好在“ Symfony \ Component \ Security \ Http \ Firewall \ ContextListener”。

下面是我的开发服务器和实时服务器的屏幕截图-服务器规格符合要求,并且我绝对确定问题不会出在服务器后面,因为其他项目在类似的服务器上运行得很好。

我很乐意为您提供任何有关如何进一步解决或调试此问题的提示。 Symfony版本是4.0.1,更新到最新版本并不能解决问题。

编辑:使用秒表组件进一步调试使我得出结论,加载时间来自Symfony / Bridge / Doctrine / Security / User / EntityUserProvider,方法“ refreshUser”,行93,调用“ $ refreshedUser = $ repository-> find($ id);”最大的一部分是2681ms中的2647ms。不过,我不知道从现在开始该去哪里。

开发 Dev - Performance Dev- Listeners

实时 Live - Performance Live - Listeners

我的安全性配置:

security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
encoders:
    App\Entity\User:
        algorithm: bcrypt
    legacy_encoder:
        algorithm: md5
        encode_as_base64: false
        iterations: 1

providers:
    in_memory: { memory: ~ }
    db_provider:
        entity:
            class: App\Entity\User
            property: username

role_hierarchy:
    ROLE_USER_MO: ROLE_USER
    ROLE_USER_WKB: ROLE_USER

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        #pattern: ^/
        #http_basic: ~

        anonymous: ~
        provider: db_provider

        user_checker: App\Security\UserChecker

        logout:
            path: /logout
            target: /login

        form_login:
            login_path: login
            check_path: login

access_control:
    #- { path: ^/, roles: ROLE_USER }
    #- { path: ^/login, allow_if: "is_anonymous() and !is_authenticated()" }
    - { path: ^/motivwelten, roles: ROLE_USER }
    - { path: ^/services/.*, roles: ROLE_USER }
    - { path: ^/shop, roles: ROLE_USER }
    - { path: ^/shop/.*, roles: ROLE_USER }
    - { path: ^/user/.*, roles: ROLE_USER }
    - { path: ^/password-forgotten, allow_if: "is_anonymous() and !is_authenticated()" }
    - { path: ^/password-forgotten/.*, allow_if: "is_anonymous() and !is_authenticated()" }
    - { path: ^/downloads, roles: ROLE_USER }

erase_credentials: false

2 个答案:

答案 0 :(得分:0)

在3月1日进行修改后,我将为您确定可以解决加载时间的“解决方案”。我认为这不能称为问题的解决方案,因为我操纵了框架的核心代码,这可能永远都不做或没有必要。

我可以肯定,问题出在我过去建立的实体结构中,用户实体中有多个fetch=EAGER部分,应尽可能避免。

我将Symfony / Bridge / Doctrine / Security / User / EntityUserProvider中的93行更改为

$refreshedUser = $repository->find($id);

$refreshedUser = $repository->find(['id' => $id]);

这将dev和live的加载时间分别从25秒减少到〜50ms,从2.5秒减少到〜100ms。

答案 1 :(得分:-1)

我解决了此问题,更改了yourproject / config / bundles.php中的捆绑包顺序

我不确定此问题的出现方式。但是我偶然发现了这种解决方法,将symfony和sensio软件包放在首位。

我不建议更改捆绑包顺序。

编辑: 抱歉,我检查了一下,我的问题是教义包的订单。