2017-02-17 8 views
1

yii2フレームワークでファイルキャッシュを使用しています。
私の質問は
である私は、キャッシュファイルを更新し、各エントリには、今の私の製品のためのキャッシュファイルを作成cacheFile.Supposeを更新せずにキャッシュするためにいくつかの余分な値を追加することが可能です。私はキャッシュに新しい製品を追加したいと思う。
は、どのように私は、事前のおかげで
これは私のコードで私は毎回私がupdateCache関数を呼び出していますが、新製品を追加したときに
キャッシュに値を追加する方法

public static function updateCache(){ 
    $product_grid = Yii::$app->db->createCommand("CALL get_products()")->queryAll(); 
    Yii::$app->cache->set('product_grid', $product_grid); 
} 

私は今、すべての製品を取得するためのストアプロシージャを記述することを行うことができますどのアプリケーション速度が達成されるかによって、製品を再生成し、キャッシュに追加する。
これはaddingProductupdateCacheためのコードです:

public function actionCreate($id = NULL) { 
    $model = new PrProducts(); 
    if ($model->load(Yii::$app->request->post())) { 
     $model->save(false); 
     self::updateCache(); 
    } 
} 
+0

[クエリキャッシングとキャッシュの依存関係](http://www.yiiframework.com/doc-2.0/guide-caching-data.html#cache-dependencies) – vishuB

+0

[Yii2 ActiveRecordキャッシュ]( http://stackoverflow.com/questions/29854882/yii2-activerecord-cache)。役に立つかもしれません – vishuB

答えて

2

ネイティブYii2キャッシュコンポーネントは一部既存のキャッシュ項目を更新することはできません。 しかし、あなたはこれを手動で行うことができます。

public static function addToCache($modelProduct) { 

    $productGrid     = Yii::$app->cache->get('productGrid'); 
    $productGrid[$modelProduct->id] = $modelProduct->attributes; 

    Yii::$app->cache->set('productGrid', $productGrid); 
} 

しかし、私は他の方法をお勧めします:あなたは、個別のキャッシュ項目として、各製品レコードを格納することができます。 まず、あなたは複数の項目を追加することができます:あなたはデータを読み取るとき

public static function refreshProductCache() { 

    // Retrieve the all products 
    $products = Yii::$app->db->createCommand("CALL get_products()")->queryAll(); 

    // Prepare for storing to cache 
    $productsToCache = []; 
    foreach ($products as $product) { 
     $productId        = $product['id']; 
     $productsToCache['product_' . $productId] = $product; 
    } 

    // Store to cache (existing values will be replaced) 
    Yii::$app->cache->multiSet($productsToCache); 
} 

は、第二に、あなたはキャッシュを更新することができます。例えば:

public function actionView($id) { 

    $model = Yii::$app->cache->getOrSet('product_'.$id, function() use ($id) { 
     return PrProducts::find() 
      ->andWhere(['id' => $id]) 
      ->one(); 
    }); 

    return $this->render('view', ['model' => $model]); 
} 

は、このコードは、キャッシュ内にまだ存在する各$id 1つだけの時間をキャッシュを作成します。

最後に、を作成/更新した後に、個々の製品をキャッシュに追加することができます。たとえば、

public static function addToCache(PrProducts $modelProduct) { 
    $productId = $modelProduct->id; 

    Yii::$app->cache->set('product_' . $productId, $modelProduct); 
} 

私はこのアプローチがより柔軟だと思います。もちろん、それはあなたよりも効率が悪いかもしれません。それはあなたのキャッシュを読み取るコードに非常に依存します。

+0

あなたのコードは私の質問とは関係のない$ idレコードだけをキャッシュしました......私は、可能なかどうかのすべての製品データを持つキャッシュに新しいレコードを追加したいと思います.... ???? – Dani

+0

@ダニ私は答えを広げた。 – IStranger

+0

あなたの提案に感謝@IStrabger ....しかし、私はデータベースの代わりにキャッシュからすべての製品にアクセスしたいですか?あなたのコードはまだ個々の製品のキャッシュを作成しました – Dani

関連する問題