Аз използвам 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
е твърде голяма, за да бъде кеширана (представете си система с милиони потребители).