2017-06-08 6 views
0

私はYii2を使用しており、認証割り当てにyii\rbac\DbManagerを使用しています。認証割り当てデータベース呼び出しyii2

私は、すべてのデータベース呼び出しから来ていると、このクエリ

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回を稼働し続け場所を確認するために、ログを見ていました。

ドキュメントはそれが認証割り当てを(私はMemcachedのを使用しています)キャッシュされます言うように私は

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

を追加しました。しかし、それは動作しないようです...

誰でも知っている?それをキャッシュする方法、または何度も何度も呼ばれ続けるのはなぜですか?

乾杯

+0

あなたのキャッシュのためのアプリケーション・コンポーネントのIDは(あなたが本当に「キャッシュ」と呼んでいることをダブルチェック)正しいことを確認してください。また、yii \ rbac \ DbManagerのキャッシュ機能はバージョン2.0.3以降も使用可能ですので、Yii2バージョンを確認してください。 – dataskills

答えて

0

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

のみキャッシュauth_itemauth_ruleauth_item_childデータ。これらのすべてのデータはキャッシュ内の単一エントリとしてキャッシュされます。 auth_assignmentが大きすぎてキャッシュできないことに注意してください( 百万人のユーザーがいるシステムを想像してください)。

0

ベンダー/ yiisoft/yii2/RBACにキャッシングを追加/ DbManager.php (また、あなたはキャッシュを必要とするすべての場所で)

このコード:

$ all_data =の$ this - >デシベル - >キャッシュ(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; 
    } 
関連する問題