0

我正在使用 Yii2 并使用yii\rbac\DbManagerfor auth 分配。

我正在查看日志以查看所有数据库调用的来源以及此查询

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)。但它似乎不起作用......

有人知道吗?如何缓存它或为什么它不断被调用这么多次?

干杯

4

2 回答 2

0

在 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;
    }
于 2017-08-09T08:30:30.260 回答
0

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

只有缓存auth_item和数据。所有这些数据都作为单个条目缓存在缓存中。请注意, 它太大而无法缓存(想象一个拥有数百万用户的系统)。auth_ruleauth_item_childauth_assignment

于 2017-08-09T07:47:33.257 回答