信じられないほどのYiiフレームワークが提供する多くの機能の中で、キャッシュ管理システムは見逃せないものです。

Yiiフレームワークを使用すると、静的データとSQL / Active Recordクエリの両方を保存できます。これを賢明に使用すると、ページの読み込み時間を大幅に節約できます。

特に、このチュートリアルでは、データとクエリをキャッシュする方法を学習します。

Yiiでキャッシュを有効にする方法は次のとおりです。

キャッシュコンポーネントをアクティブ化する


最初のステップは、キャッシュコンポーネントをアクティブ化することです。 構成ファイル(protected / config /の下にあります)を開き、 components アレイに移動して、アレイ内に次のコードを追加するだけです。

'cache'=>array( 
    'class'=>'system.caching.CDbCache'
)

そうすることで、Yiiで利用可能なキャッシングコンポーネントの1つであるCDbCacheを使用することを選択しています。 この特定のものは、キャッシュされたデータを SQLite データベースに保存します。これにより、セットアップが非常に簡単になります。 パフォーマンスの点では最良の選択ではありませんが、それでもWebアプリケーションはわずかに高速になります。

もう1つの実行可能でより強力なオプションは、 CApcCache コンポーネントを使用することです。これは、PHPの最新バージョンに付属する組み込みのキャッシュシステムであるAPCを利用します。 ]。

これらのキャッシュコンポーネントはすべてCCacheクラスの最上位に基づいているため、コンポーネントの名前を変更することで、キャッシュコンポーネントから別のコンポーネントに簡単に切り替えることができます(例: system.caching.CApcCache)、アプリケーション全体でコードを変更する必要はありません。

シンプルなデータキャッシング


キャッシュを使用する最初の最も簡単な方法は、変数を格納することです。 そのために、Yiiのキャッシュコンポーネントには、 get() set()の2つの関数があります。

したがって、キャッシュする値を設定することから始めます。 そのためには、一意のIDも割り当てる必要があります。 例えば:

// Storing $value in Cache
$value = "This is a variable that I am storing";
$id    = "myValue";
$time  = 30; // in seconds

Yii::app()->cache->set($id, $value, $time);

最後の値$timeは必須ではありませんが、不要なときに値を永久に保存しないようにするために役立ちます。

保存された値を取得するのは簡単です。

Yii::app()->cache->get($id);

値が見つからない場合(存在しないため、または以前に期限切れになったため)、この関数はfalse値を返します。 したがって、たとえば、特定の値がキャッシュされているかどうかを確認するための優れた方法は次のとおりです。

$val = Yii::app()->cache->get($id);
if (!$val):
    // the value is not cached, do something here
else:
    // the value is cached, do something else here
endif;

キャッシュされた値を削除する


キャッシュに保存されている値を削除するには、次の呼び出しを行います。

Yii::app()->cache->delete($id);

すべてをクリーンアップする必要がある場合は、次のように記述します。

Yii::app()->cache->flush();

クエリキャッシング


データキャッシングシステム上に構築されたこれは、特にデータベースに大きく依存する重いアプリにとって非常に便利な機能です。

この機能の概念はかなり簡単ですが、かなり堅実です。

まず、依存関係クエリを定義する必要があります。 つまり、実際に必要なものの前に呼び出す、はるかに単純で軽量なデータベースクエリを定義します。 これを行う理由は、そのクエリを最後に実行してから何かが変更されていないかどうかを確認するためです。

たとえば、取得するデータが本の著者のリストである場合、依存関係のクエリは次のようになります。

SELECT MAX(id) FROM authors

そうすることで、前回のチェック以降に新しい著者が追加されているかどうかを確認できます。 新しい作成者が追加されていない場合、Yiiのキャッシュコンポーネントは、次のような大きなクエリを再度実行することなく、作成者リストをキャッシュから直接取得します。

SELECT authors.*, book.title 
FROM authors 
JOIN book ON book.id = authors.book_id

Yiiクエリビルダー


Yii Query Builder でクエリキャッシングを使用するには、これを作成する必要があります[前に示した作成者の例を使用して]:

// big query
$query = ' SELECT authors.*, book.title 
FROM authors 
JOIN book ON book.id = authors.book_id';
// dependency query 
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors'); 
// executing query using Yii Query Builder
$result = Yii::app()->db->cache(1000, $dependency)->createCommand($query)->queryAll();

Yii::app()->db->cache()に渡される引数は、それぞれ、結果が保存される秒数と依存関係クエリです。

前に説明したように、このコードを実行すると、Yiiは依存関係クエリの結果を何よりも先にチェックします。 何も見つからない場合、または以前に保存された値とは異なる値が見つからない場合は、大きなクエリを実行し、結果をキャッシュに保存します。 それ以外の場合は、キャッシュから大きなクエリ結果を抽出します。

アクティブレコード


ActiveRecordを使用して行われたクエリの結果をキャッシュすることも可能です。 概念は前に説明したものと同じままです。 もちろん、構文は異なります。

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
$authors = Author::model()->cache(1000, $dependency)->with('book')->findAll();

心に留めておくべきこと


一貫性のないデータをユーザーに提供するリスクが必然的に高まるため、キャッシュを集中的に使用するアプリケーションを事前に適切に設計する必要があることは明らかです。

また、各キャッシュコンポーネントには、保存できるデータの量に制限がある場合があることを忘れないでください。 したがって、キャッシュシステムの制限を事前に確認しておくことをお勧めします。

投稿者: https ://twitter.com/marcotroisi