概要

concrete5 におけるキャッシュとは、将来的により早く取得するためにデータを保存することを指します。

オブジェクトキャッシュ

concrete5 は PSR-6 と互換性のあるキャッシング・レイヤーを使用します。3種類のキャッシング・プールがデフォルトでセットアップされます。

  • cache - メモリ上か、非常に高速なキャッシング・ドライバー上に保管するオブジェクトキャッシュです。このキャッシュに置かれたオブジェクトが複数のリクエストを横断して有効であることを意図している場合、これらのキャッシュはプログラマの必要に応じてクリアできなければなりません。注意:デフォルトではこのキャッシュは揮発性ですが、concrete.cache.levels.object 設定値によって変更可能です。
  • cache/request - 単一のリクエストの間メモリ上に保管される揮発性のキャッシュです。注意:これは CacheLocal APIの代替です。
  • cache/expensive - これは低速なキャッシュに保管することでパフォーマンス上の利点たある場合を意図したキャッシュです。このキャッシュはデフォルトではファイルシステムに永続化され、アクセスの際に揮発性キャッシュに読み込まれますので、同じリクエスト内で同じデータに続けてアクセスする際に高速に動作します。この重いキャッシュは concrete.cache.levels.expensive 設定値によって変更可能です。

オブジェクトキャッシュを利用する

"StudentList" オブジェクトを取得する際にオブジェクトキャッシュを利用する例です。

/**
 * @return StudentList
 */
public static function getByCourseID($id)
{
    $expensiveCache = \Core::make('cache/expensive');
    $studentCourseList = $expensiveCache->getItem('StudentList/Course' . $id);
    if ($studentCourseList->isMiss()) {
        $studentCourseList->lock();
        $list = StudentList::findBy(array('course_id' => $id));
        $studentCourseList->set($list, 300); // expire after 300 seconds
    }
    return $studentCourseList->get();
}

この例では、キャッシュを StudentList/Course{$id} というキーで生成しています。重いキャッシュからアイテムが見つからなかった場合に、データベースから取得し重いキャッシュに追加し、取得した値を返しています。

set 関数に渡された2つ目の引数は、キャッシュ値の有効期間です。この有効期間は秒単位で数値で表すことができるほか、いつ失効するかを DateTime オブジェクトで指定することもできます。

注意:キャッシュアイテムをどのくらい深くネストするべきかについては、注意が必要です。アイテムパスの / ごとにディレクトリ構造が作られます。ファイルパスの文字数に制限のあるファイルシステムにおいては、問題を引き起こす可能性があります。

このキャッシュを失効させたい場合(例えば、このコースに新しい生徒を追加した場合)、このようにできます。

public addStudentToCourse($studentId, $courseId)
{
    //code to actually add the student to the course
    $expensiveCache = \Core::make('cache/expensive');
    $studentCourseList = $expensiveCache->getItem('StudentList/Course' . $courseId);
    $studentCourseList->clear();
}

concrete5 のビルトイン・キャッシングプールのキャッシュの失効は、ユーザーが管理画面からキャッシュをクリアした際にも起こります。

原文:Overview