ホームページ  >  記事  >  バックエンド開発  >  Yii Framework 公式ガイド サプリメント シリーズ 29 - キャッシュ: データのキャッシュ

Yii Framework 公式ガイド サプリメント シリーズ 29 - キャッシュ: データのキャッシュ

黄舟
黄舟オリジナル
2017-02-15 09:15:201166ブラウズ



データ キャッシュは、一部の PHP 変数をキャッシュに保存し、後でキャッシュから取得します。この目的のために、キャッシュ コンポーネントの基本クラス CCache は、最も一般的に使用される 2 つのメソッド、set() と get() を提供します。

変数 $value をキャッシュに保存するには、一意の ID を選択し、set() を呼び出してそれを保存します: $value ,我们选择一个唯一 ID 并调用 set() 存储它:


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

缓存的数据将一直留在缓存中,除非它由于某些缓存策略(例如缓存空间已满,旧的数据被删除)而被清除。 要改变这种行为,我们可以在调用 set() 的同时提供一个过期参数,这样在设定的时间段之后,缓存数据将被清除:


// 值$value 在缓存中最多保留30秒
Yii::app()->cache->set($id, $value, 30);

稍后当我们需要访问此变量时(在同一个或不同的 Web 请求中),就可以通过 ID 调用 get() 从缓存中将其取回。 如果返回的是 false,表示此值在缓存中不可用,我们应该重新生成它。


$value=Yii::app()->cache->get($id);
if($value===false)
{
    // 因为在缓存中没找到 $value ,重新生成它 ,
    // 并将它存入缓存以备以后使用:
    // Yii::app()->cache->set($id,$value);
}

为要存入缓存的变量选择 ID 时,要确保此 ID 对应用中所有其他存入缓存的变量是唯一的。 而在不同的应用之间,这个 ID 不需要是唯一的。缓存组件具有足够的智慧区分不同应用中的 ID。

一些缓存存储器,例如 MemCache, APC, 支持以批量模式获取多个缓存值。这可以减少获取缓存数据时带来的开销。 从版本 1.0.8 起,Yii 提供了一个新的名为 mget() 的方法。它可以利用此功能。如果底层缓存存储器不支持此功能,mget() 依然可以模拟实现它。

要从缓存中清除一个缓存值,调用 delete(); 要清楚缓存中的所有数据,调用 flush()。 当调用 flush() 时一定要小心,因为它会同时清除其他应用中的缓存。

提示: 由于 CCache 实现了 ArrayAccess,缓存组件也可以像一个数组一样使用。下面是几个例子:


$cache=Yii::app()->cache;
$cache['var1']=$value1;  // 相当于: $cache->set('var1',$value1);
$value2=$cache['var2'];  // 相当于: $value2=$cache->get('var2');

缓存依赖

除了过期设置,缓存数据也可能会因为依赖条件发生变化而失效。例如,如果我们缓存了某些文件的内容,而这些文件发生了改变,我们就应该让缓存的数据失效, 并从文件中读取最新内容而不是从缓存中读取。

我们将一个依赖关系表现为一个 CCacheDependency 或其子类的实例。 当调用 set() 时,我们连同要缓存的数据将其一同传入。


// 此值将在30秒后失效
// 也可能因依赖的文件发生了变化而更快失效
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));

现在如果我们通过调用get() 从缓存中获取 $value

  • rrreee

  • キャッシュされたデータは常に何らかのキャッシュ ポリシー (キャッシュ スペースがいっぱいになった、古いデータが削除されたなど) によってクリアされない限り、 キャッシュ 。 この動作を変更するには、set() を呼び出すときに有効期限パラメータを指定して、一定期間が経過するとキャッシュされたデータがクリアされるようにすることができます。変数が (同じ Web リクエストまたは別の Web リクエストで) アクセスされると、ID を指定して get() を呼び出すことでキャッシュから取得できます。 false が返された場合は、この値がキャッシュ内に存在しないため、値を再生成する必要があることを意味します。
  • rrreee

  • キャッシュする変数の ID を選択するときは、その ID がアプリケーション内の他のすべてのキャッシュ変数に対して一意であることを確認してください。 この ID は、異なるアプリケーション間で一意である必要はありません。キャッシュ コンポーネントは、さまざまなアプリケーションの ID を区別するのに十分な機能を備えています。

    MemCache、APC などの一部のキャッシュ メモリは、バッチ モードでの複数のキャッシュ値の取得をサポートしています。これにより、キャッシュされたデータを取得するオーバーヘッドが軽減されます。 バージョン 1.0.8 以降、Yii は mget() という名前の新しいメソッドを提供します。この機能を活用できます。基礎となるキャッシュ メモリがこの機能をサポートしていない場合でも、mget() はそれをシミュレートできます。
  • キャッシュされた値をキャッシュからクリアするには、delete() を呼び出し、キャッシュ内のすべてのデータをクリアするには、flush() を呼び出します。 ほかのアプリケーションのキャッシュもクリアされるため、flush() を呼び出すときは注意してください。

    ヒント: CCache は ArrayAccess を実装しているため、キャッシュ コンポーネントも配列のように使用できます。以下にいくつかの例を示します。
rrreee

キャッシュの依存関係

有効期限の設定に加えて、依存関係の条件の変更により、キャッシュされたデータが無効になる場合もあります。たとえば、特定のファイルの内容をキャッシュし、それらのファイルが変更された場合、キャッシュされたデータを無効にし、キャッシュからではなくファイルから最新の内容を読み取る必要があります。

依存関係は CCacheDependency またはそのサブクラスのインスタンスとして表されます。 set() を呼び出すときに、キャッシュされるデータと一緒に set() を渡します。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜 ここで、 get() を呼び出してキャッシュから $value を取得すると、依存関係がチェックされ、変更された場合は false の値が取得されます。データを再生成する必要があることを示します。 🎜🎜以下は、利用可能なキャッシュ依存関係の簡単な説明です: 🎜🎜🎜🎜CFileCacheDependency: ファイルの最終変更時刻が変更されると、依存関係も変更されます。 🎜🎜🎜🎜CDirectoryCacheDependency: ディレクトリとそのサブディレクトリ内のファイルが変更されると、依存関係も変更されます。 🎜🎜🎜🎜CDbCacheDependency: 指定された SQL ステートメントのクエリ結果が変更されると、依存関係が変更されます。 🎜🎜🎜🎜CGlobalStateCacheDependency: 指定されたグローバル状態が変化すると、依存関係も変化します。グローバル状態は、アプリケーション内のリクエスト間およびセッション間の変数です。これは CApplication::setGlobalState() を通じて定義されます。 🎜🎜🎜🎜CChainedCacheDependency: チェーン内の依存関係が変更されると、この依存関係も変更されます。 🎜🎜🎜🎜CExpressionDependency: 指定された PHP 式の結果が変更されると、依存関係が変更されます。このクラスはバージョン 1.0.4 以降で利用可能です。 🎜🎜🎜🎜上記は、Yii Framework 公式ガイド補足シリーズ 29 - キャッシュ: データ キャッシュの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。 🎜🎜🎜🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。