Вызов базы данных назначения аутентификации yii2

Я использую 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). Но похоже не работает...

У кого-нибудь есть идеи? Либо как его кэшировать, либо почему он вызывается так много раз?

Ваше здоровье


person George Hallam    schedule 08.06.2017    source источник
comment
Убедитесь, что идентификатор компонента приложения для вашего кеша правильный (дважды проверьте, что вы действительно назвали его кешем). Также обратите внимание, что функция кеша для yii\rbac\DbManager доступна с версии 2.0.3, поэтому проверьте версию Yii2.   -  person dataskills    schedule 09.06.2017


Ответы (2)


Добавьте кэширование в vendor/yiisoft/yii2/rbac/DbManager.php (Также во всех местах, где вам нужно кэширование)

этот код:

$all_data = $this->db->cache(function ($db) use ($query) { return $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;
    }
person Sergg Mart    schedule 09.08.2017

https://github.com/yiisoft/yii2/issues/3168

Кешировать только данные auth_item, auth_rule и auth_item_child. Все эти данные кэшируются как одна запись в кеше. Обратите внимание, что auth_assignment слишком велик для кэширования (представьте себе систему с миллионами пользователей).

person Sergg Mart    schedule 09.08.2017