/ / Auth присвояване на база данни за повикване yii2 - php, yii, yii2, yii2-advanced-app, yii2-rbac

Автоматично извикване на база данни за присвояване yii2 - php, yii, yii2, yii2-advanced-app, yii2-rbac

Аз използвам Yii2 и използвам yiirbacDbManager за задаване на автор.

Гледах дневниците, за да разбера откъде идват всички обаждания от база данни и тази заявка

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" => "yiirbacDbManager",
"cache" => "cache"
],

Както се казва в документите, те ще кешират заданията на auth (използвам Memcached). Но това не изглежда да работи ...

Всеки, който има някаква идея? Или как да го кеширате, или защо той се нарича толкова много пъти?

Наздраве

Отговори:

0 за отговор № 1

Добавете кеширане в продавач / yiisoft / yii2 / RBAC / DbManager.php (Също така във всички места се нуждаете от кеширане)

този код:

$ all_data = $ this-> db-> кеш (функция ($ db) използвайте ($ 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;
}

0 за отговор № 2

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

Само кеш auth_item, auth_rule и auth_item_child данни. Всички тези данните се кешират като единичен запис в кеша. Отбележи, че auth_assignment е твърде голяма, за да бъде кеширана (представете си система с милиони потребители).