ホームページ >バックエンド開発 >PHPチュートリアル >Yii Framework 公式ガイド シリーズ 30 - キャッシング: フラグメントキャッシング
フラグメントキャッシュとは、Web ページの特定のフラグメントをキャッシュすることを指します。たとえば、ページに年間売上高の概要がテーブルで表示されている場合、このテーブルをキャッシュに保存して、リクエストごとにテーブルを再生成する時間を短縮できます。
フラグメント キャッシュを使用するには、コントローラー ビュー スクリプトで CController::beginCache() と CController::endCache() を呼び出します。どちらのメソッドも、キャッシュされるページ コンテンツを含めて開始および終了します。データ キャッシュと同様に、キャッシュされたフラグメントを識別するには番号が必要です。
...别的HTML内容... <?php if($this->beginCache($id)) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...别的HTML内容...
上記では、beginCache() が false を返した場合、キャッシュされたコンテンツがこの場所に自動的に挿入されます。それ以外の場合は、if
ステートメント内のコンテンツが実行されます。 endCache() がトリガーされたときにキャッシュに格納されます。 if
语句内的内容将被执行并在endCache()触发时缓存。
当调用beginCache(),可以提供一个数组由缓存选项组成的作为第二个参数,以自定义片段缓存。事实上为了方便,beginCache() 和endCache()方法是[ COutputCache ]widget的包装。因此COutputCache的所有属性都可以在缓存选项中初始化。
也许是最常见的选项是duration,指定了内容在缓存中多久有效。和CCache::set()过期参数有点类似。下面的代码缓存内容片段最多一小时:
...其他HTML内容... <?php if($this->beginCache($id, array('duration'=>3600))) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...其他HTML内容...
如果我们不设定期限,它将默认为60 ,这意味着60秒后缓存内容将无效。
像data caching ,内容片段被缓存也可以有依赖。例如,文章的内容被显示取决于文章是否被修改。
要指定一个依赖,我们建立了dependency选项,可以是一个实现ICacheDependency的对象或可用于生成依赖对象的配置数组。下面的代码指定片段内容取决于lastModified
列的值是否变化:
...其他HTML内容... <?php if($this->beginCache($id, array('dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...其他HTML内容...
缓存的内容可根据一些参数变化。例如,每个人的档案都不一样。缓存的档案内容将根据每个人ID变化。这意味着,当调用beginCache()时将用不同的ID。
COutputCache内置了这一特征,程序员不需要编写根据ID变动内容的模式。以下是摘要。
varyByRoute: 设置此选项为true ,缓存的内容将根据route变化。因此,每个控制器和行动的组合将有一个单独的缓存内容。
varyBySession: 设置此选项为true ,缓存的内容将根据session ID变化。因此,每个用户会话可能会看到由缓存提供的不同内容。
varyByParam: 设置此选项的数组里的名字,缓存的内容将根据GET参数的值变动。例如,如果一个页面显示文章的内容根据id
的GET参数,我们可以指定varyByParam为array('id')
...其他HTML内容... <?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...其他HTML内容...期間を設定しない場合、デフォルトで 60 になります。これは、キャッシュされたコンテンツが 60 秒後に無効になることを意味します。 依存関係 データ キャッシュと同様に、コンテンツ フラグメントもキャッシュされるときに依存関係を持つことができます。たとえば、記事の内容は、記事が変更されたかどうかに応じて表示されます。 依存関係を指定するには、依存関係オプションを作成します。これは、ICacheDependency を実装するオブジェクト、または依存関係オブジェクトの生成に使用できる構成配列にすることができます。次のコードは、フラグメントのコンテンツが
lastModified
列の値が変更されるかどうかに依存することを指定します。たとえば、プロフィールは人それぞれ異なります。キャッシュされたプロファイルの内容は、各個人 ID に基づいて変更されます。これは、beginCache() が呼び出されるときに別の ID が使用されることを意味します。
COutputCache にはこの機能が組み込まれており、プログラマは ID に基づいてコンテンツを変更するパターンを記述する必要はありません。以下に概要を示します。
varyByParam: このオプションの配列に名前を設定します。キャッシュされたコンテンツは GET パラメーターの値に応じて変更されます。たとえば、ページに id
GET パラメータに基づいて記事コンテンツが表示される場合、varyByParam を array('id')
として指定すると、各記事コンテンツをキャッシュできるようになります。このような変更がなければ、特定の記事しかキャッシュできなくなります。
...其他HTML内容... <?php if($this->beginCache($id1)) { ?> ...外部被缓存内容... <?php if($this->beginCache($id2)) { ?> ...内部被缓存内容... <?php $this->endCache(); } ?> ...外部被缓存内容... <?php $this->endCache(); } ?> ...其他HTML内容...🎜🎜🎜2. ネストされたキャッシュ 🎜🎜 フラグメント キャッシュはネストできます。つまり、キャッシュ フラグメントは、より大きなフラグメント キャッシュに接続されます。たとえば、コメントは内部スニペット キャッシュにキャッシュされ、記事コンテンツと一緒に外部キャッシュにキャッシュされます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜ネストされたキャッシュでは、さまざまなキャッシュ オプションを設定できます。たとえば、上の例では、内部キャッシュと外部キャッシュを異なる期間値に設定できます。外部キャッシュに格納されたデータが無効な場合でも、内部キャッシュは有効な内部フラグメントを提供できます。 しかし、その逆は当てはまりません。外部キャッシュに有効なデータが含まれている場合は、内部キャッシュ内のコンテンツの有効期限が切れている場合でも、キャッシュされたコピーが永久に保持されます。 🎜🎜上記は、Yii Framework 公式ガイド シリーズ 30 - キャッシュ: フラグメント キャッシュの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。 🎜🎜🎜🎜