2017-06-08 4 views
0

J'utilise Yii2 et j'utilise yii\rbac\DbManager pour l'attribution d'authentification.Appel de la base de données d'affectation Auth yii2

Je regardais les journaux pour voir où tous les appels de base de données viennent et cette requête

SELECT `b`.* FROM `auth_assignment` `a`, `auth_item` `b` WHERE 
((`a`.`item_name`=`b`.`name`) AND (`a`.`user_id`='91')) AND (`b`.`type`=1) 

continue à tourner encore et encore, parfois 10/15 fois de suite.

J'ai ajouté

'authManager' => [ 
     'class' => 'yii\rbac\DbManager', 
     'cache' => 'cache' 
    ], 

Comme les docs disent que les affectations en cache auth (j'utilise Memcached). Mais il ne semble pas fonctionner ...

Quelqu'un a-t-il une idée? Soit comment le mettre en cache ou pourquoi il continue à être appelé tant de fois?

Vive

+0

Vérifiez que le composant ID d'application pour votre cache est correcte (vérifiez que vous avez vraiment appelé "cache"). Notez également que la fonctionnalité de cache pour yii \ rbac \ DbManager est disponible depuis la version 2.0.3, donc vérifiez votre version de Yii2. – dataskills

Répondre

0

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

Seulement cache auth_item, auth_rule et auth_item_child données. Toutes ces données sont mises en cache en tant qu'entrée unique dans le cache. Notez que auth_assignment est trop grand pour être mis en cache (imaginez un système avec millions d'utilisateurs).

0

Ajouter à la mise en cache fournisseur/yiisoft/yii2/CCNP/DbManager.php (également dans tous les endroits dont vous avez besoin la mise en cache)

ce code:

$ all_data = $ this-> db -> cache (function ($ db) use ($ query) { return $ query-> tout ($ 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; 
    }