TraceableFirewallListener чрезвычайно долгое время загрузки
В одном из моих проектов 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-". > находка ($ ID);" по большей части, как в 2647 мс из 2681 мс. Однако я понятия не имею, куда идти дальше.
Dev
Конфигурация моей безопасности:
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
0 ответов
В продолжение моего редактирования 1 марта я предоставлю "решение", которое установило время загрузки для меня. Я не думаю, что это можно назвать решением проблемы, так как я манипулировал основным кодом фреймворка, что, вероятно, никогда не должно быть сделано или необходимо.
Я вполне уверен, что проблема заключается в структуре сущностей, которую я построил за это время, где есть несколько fetch=EAGER
части в пользовательской сущности, которых следует избегать, где это возможно.
Я изменил строку 93 в Symfony/Bridge/Doctrine/Security/User/EntityUserProvider из
$refreshedUser = $repository->find($id);
в
$refreshedUser = $repository->find(['id' => $id]);
Это уменьшило время загрузки с 25 секунд до ~50 мс и с 2,5 секунд до ~100 мс на dev и live соответственно.
Я решил эту проблему, изменив порядок пакетов в yourproject / config / bundles.php
я не уверен, как возникает эта проблема. но я случайно обнаружил это средство, поставив на первое место пакеты symfony и sensio.
Я не рекомендую менять порядок пакетов.
изменить: извините, я проверил, и проблема в моем случае была в порядке пакета доктрины.