Я использую Yii2 и использую yii\rbac\DbManager
для авторизации.
Я просматривал журналы, чтобы увидеть, откуда поступают все вызовы базы данных, и этот запрос
SELECT `b`.* FROM `auth_assignment` `a`, `auth_item` `b` WHERE
((`a`.`item_name`=`b`.`name`) AND (`a`.`user_id`='91')) AND (`b`.`type`=1)
Продолжает бегать снова и снова, иногда 10/15 раз подряд.
я добавил
'authManager' => [
'class' => 'yii\rbac\DbManager',
'cache' => 'cache'
],
Как говорят в документах, будет кешировать аутентификационные назначения (я использую Memcached). Но это не похоже на работу …
У кого-нибудь есть идеи? Либо как его кешировать, либо почему он так часто вызывается?
ура
Добавить кеширование в
продавец / yiisoft / yii2 / RBAC / DbManager.php
(Также во всех местах вам нужно кэширование)
этот код:
$ all_data = $ this-> db-> cache (функция ($ db) use ($ query) {
вернуть $ query-> all ($ db);
}, 360);
public function getAssignments($userId)
{
if (empty($userId)) {
return [];
}
$query = (new Query)
->from($this->assignmentTable)
->where(['user_id' => (string) $userId]);$all_data = $this->db->cache(function ($db) use ($query) {
return $query->all($db);
},360);$assignments = [];
foreach ($all_data as $row) {
$assignments[$row['item_name']] = new Assignment([
'userId' => $row['user_id'],
'roleName' => $row['item_name'],
'createdAt' => $row['created_at'],
]);
}
return $assignments;
}
https://github.com/yiisoft/yii2/issues/3168
Только кеш auth_item
, auth_rule
а также auth_item_child
данные. Все эти
данные кэшируются как одна запись в кеше. Обратите внимание, что
auth_assignment
слишком большой для кэширования (представьте систему с
миллионы пользователей).