Eu estou usando o Yii2 e usando o yiirbacDbManager
para atribuição de autenticação.
Eu estava olhando para os logs para ver onde todas as chamadas de banco de dados estão vindo e esta consulta
SELECT `b`.* FROM `auth_assignment` `a`, `auth_item` `b` WHERE
((`a`.`item_name`=`b`.`name`) AND (`a`.`user_id`="91")) AND (`b`.`type`=1)
Continua a correr de novo e de novo, por vezes 10/15 vezes em sucessão.
Eu adicionei
"authManager" => [
"class" => "yiirbacDbManager",
"cache" => "cache"
],
Como dizem os documentos, o cache armazenará as atribuições de auth (estou usando o Memcached). Mas parece que não funciona ...
Alguem tem alguma idéia? Como armazenar em cache ou por que continua sendo chamado tantas vezes?
Felicidades
Respostas:
0 para resposta № 1Adicionar cache em fornecedor / yiisoft / yii2 / rbac / DbManager.php (Também em todos os lugares você precisa de cache)
este código:
$ all_data = $ this-> db-> cache (uso da função ($ db) ($ 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;
}
0 para resposta № 2
https://github.com/yiisoft/yii2/issues/3168
Apenas cache auth_item
, auth_rule
e auth_item_child
dados. Todos estes os dados são armazenados em cache como uma única entrada no cache. Observe que
auth_assignment
é muito grande para ser armazenado em cache (imagine um sistema com milhões de usuários).