タグを使用したYiiでのキャッシュ

Yiiでは、データベースから直接返される配列としてデータをキャッシュできます。

また、キャッシングシステムにはさまざまな依存関係があります。 ただし、これらの依存関係では、アクセスすることなくテーブルの変更を自動的に追跡することはできません(つまり、CDbCacheDependency)。これは、読み込まれたシステムでは意味がありません。



そのようなことから、いわゆるタグ付けを思いつきました。 つまり いくつかのタグが作成され、このテーブルに関連付けられているすべてのキャッシュとともに保存されます。 そして、変更されるとすぐに、関連するすべてのキャッシュが再起動するはずです。 Yiiで判明したように、これは非常に簡単に行われます。







Active Recordがより快適に使用されることを言及する価値があります。



このようにします。 新しい依存関係を作成して、たとえばコンポーネントに保存します。



/** * CTagCacheDependency class. * * CTagCacheDependency represents a dependency based on a autoincrement(timestamp) of tags * * @author Roman <astronin@gmail.com> * @since 1.0 */ class CTagCacheDependency extends CCacheDependency { /** * @var autoincrement(timestamp) param is used to * check if the dependency has been changed. */ public $tag; /** * Cache component, by default used - cache * @var CCache */ public $cache; /** * Name of cache component, by default used - cache * @var string */ public $cacheName; /** * Constructor. * @param string $tag value of the tag for module */ public function __construct($tag=null, $cacheName='cache') { $this->tag=$tag; $this->cacheName = $cacheName; } /** * Generates the data needed to determine if dependency has been changed. * This method returns the integer(timestamp). * @return mixed the data needed to determine if dependency has been changed. */ protected function generateDependentData() { if($this->tag!==null) { $this->cache = Yii::app()->getComponent($this->cacheName); $t = $this->cache->get($this->tag); if ($t === false) { $t = microtime(true); $this->cache->set($this->tag, $t); } return $t; } } }
      
      







モデルでは、新しい依存関係をいつ使用するかを示します。 モデル全体に​​対してこれを実行するため、 beforeFind関数にコードを追加します。



 protected function beforeFind() { $this->cache(30, new CTagCacheDependency(get_class($this))); parent::beforeFind(); }
      
      







さて、またはどこでも、ここでの主なものは「$ this-> cache(30、new CTagCacheDependency(get_class($ this)));」です。







タグとして、クラスの名前、特定のテーブルに関連付けられたモデルがあります。



何かを削除または保存するとき、適切な場所(afterDelete、afterSave関数)に書き込みます。



 Yii::app()->cache->set(get_class($this), microtime(true), 0);
      
      











これにより、このモデルに関連付けられたタグを更新し、それに応じてテーブルを更新します。 これで、テーブルを更新した結果としてタグが更新された場合、このタグに依存するすべてのキャッシュを更新する必要があります。



デフォルトのキャッシュが使用されます-コンポーネント:キャッシュ。 しかし、他のものを指定できます。



使用された文献:





UPD重要!



更新されたクラスコードCTagCacheDependency



コンストラクタは、コンポーネントの名前を文字列として受け入れるようになりました。 例:

 $this->cache($duration, new CTagCacheDependency(get_class($this), 'cache'));
      
      







memcacheの不適切な動作のために作成されました。






All Articles