Yiiでは、データベースから直接返される配列としてデータをキャッシュできます。
また、キャッシングシステムにはさまざまな依存関係があります。 ただし、これらの依存関係では、アクセスすることなくテーブルの変更を自動的に追跡することはできません(つまり、CDbCacheDependency)。これは、読み込まれたシステムでは意味がありません。
そのようなことから、いわゆるタグ付けを思いつきました。 つまり いくつかのタグが作成され、このテーブルに関連付けられているすべてのキャッシュとともに保存されます。 そして、変更されるとすぐに、関連するすべてのキャッシュが再起動するはずです。 Yiiで判明したように、これは非常に簡単に行われます。
Active Recordがより快適に使用されることを言及する価値があります。
このようにします。 新しい依存関係を作成して、たとえばコンポーネントに保存します。
class CTagCacheDependency extends CCacheDependency { public $tag; public $cache; public $cacheName; public function __construct($tag=null, $cacheName='cache') { $this->tag=$tag; $this->cacheName = $cacheName; } 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)));」です。
- 30-キャッシュ保存時間。ただし、この値を変数に入れる方が良い
- CTagCacheDependency-新しい依存関係のクラス
- get_class($ this)-タグ名-モデル名
タグとして、クラスの名前、特定のテーブルに関連付けられたモデルがあります。
何かを削除または保存するとき、適切な場所(afterDelete、afterSave関数)に書き込みます。
Yii::app()->cache->set(get_class($this), microtime(true), 0);
- 0-無限のストレージ
- get_class($ this)-タグ名-モデル名
- microtime(true)-新しいタグ値
これにより、このモデルに関連付けられたタグを更新し、それに応じてテーブルを更新します。 これで、テーブルを更新した結果としてタグが更新された場合、このタグに依存するすべてのキャッシュを更新する必要があります。
デフォルトのキャッシュが使用されます-コンポーネント:キャッシュ。 しかし、他のものを指定できます。
使用された文献:
UPD重要!更新されたクラスコード
CTagCacheDependencyコンストラクタは、コンポーネントの名前を文字列として受け入れるようになりました。 例:
$this->cache($duration, new CTagCacheDependency(get_class($this), 'cache'));
memcacheの不適切な動作のために作成されました。