Я использую bouncer для своих потребностей ACL, и с тех пор, как я обновил свой проект с laravel 5.7 до 5.8, я заметил значительное увеличение времени, которое требуется для обработки моих запросов.
Я имею дело с двумя моделями (назовем их Parent
и Child
), а также с разрешениями, которые аутентифицированный пользователь имеет над ними.
// Takes about 110ms. Eager loads various nested relationships and counters with specific constraints
$parents = Parent::myScope(...)->get();
// Bottleneck. Takes 5 minutes (!). Used to take about 40 seconds on laravel 5.7
$parents->each(function ($parent) {
$parent->permissions = [
'edit' => auth()->user()->can('edit', $parent),
'delete' => auth()->user()->can('delete', $parent),
'restore' => auth()->user()->can('restore', $parent)
];
$parent->children()->each(function ($child) {
$child->permissions = [
'edit' => auth()->user()->can('edit', $child),
'delete' => auth()->user()->can('delete', $child),
'restore' => auth()->user()->can('restore', $child)
];
}
}
Я добавляю такие разрешения, потому что переменная $parents
будет отправлена как json во внешний интерфейс. Я почти уверен, что эта реализация неверна и должна иметь лучшую альтернативу, но реальная проблема - это необъяснимое пятикратное увеличение времени загрузки.
Время было получено с использованием Debugbar
мер.
Используя команду monitor
в redis-cli
(я использую Redis
для кэширования разрешений), я заметил, что запросы GET приходят медленнее, чем раньше. Фактически, даже после того, как я прекращаю загрузку страницы ( ESC ), запросы GET к Redis не прекращаются немедленно. Я не уверен, нормальное ли это поведение или нет.
Я пытался проверить проблемы в репозитории, но ничего не нашел.