キャッシュ

class Cake\Cache\Cache

キャッシュは、外部のリソースからの読み込みや作成にかかる時間を短縮するためによく使用されます。 遅いリソースから速く読み込むためにもよく使用されます。頻繁に変更されない、遅いクエリーの結果や リモートのウェブサービスへのアクセスをキャッシュに保存することができます。 一旦キャッシュに保存されると、保存されたリソースのキャッシュからの再読み込みは、 リモートリソースへのアクセスより高速です。

CakePHP のキャッシュは、主に Cache クラスを使用します。 このクラスは、すべての異なる種類のキャッシュの実装を扱うための、統一された API を提供する、 静的なメソッドを持ちます。CakePHP にはいくつかの組み込みのキャッシュエンジンが用意されていて、 独自のキャッシュシステムを実装するための簡単な仕組みを提供します。 以下が、組み込みのキャッシュエンジンです。

  • FileCache File キャッシュはローカルファイルを使用するシンプルなキャッシュです。 最も遅いキャッシュエンジンで、アトミックな操作のための多くの機能を持ちません。 しかし、ディスクストレージは非常に安価なので、頻繁に書き込みが行なわれない 大きなオブジェクトや要素の保存はファイルに適しています。
  • ApcCache APC キャッシュは、PHP の APCu 拡張を使用します。 この拡張はオブジェクトを保存するためにウェブサーバー上の共有メモリーを使います。 これはとても高速で、かつアトミックな読み込み/書き込みの機能を提供することが可能になります。
  • Wincache Wincache は Wincache 拡張を使います。 Wincache は APC と同様の機能とパフォーマンスを持ちますが、Windows と IIS に最適化されています。
  • XcacheEngine Xcache は APC と同様の機能を持つ PHP 拡張です。
  • MemcachedEngine Memcached 拡張を使います。
  • RedisEngine phpredis 拡張を使います。 Redis は高速で、Memcached と同様の永続キャッシュシステム、アトミックな操作を提供します。

あなたが選択したキャッシュエンジンに関わらず、 アプリケーションは一貫した方法で Cake\Cache\Cache とやり取りします。 あなたはアプリケーションが大きくなるにつれてキャッシュエンジンを交換することができます。

Cache クラスの設定

static Cake\Cache\Cache::config($key, $config = null)

キャッシュクラスの設定はどこでもできますが、一般的には、ブート処理中に設定を行ないます。 config/app.php ファイルで行なうのが従来からの慣習です。あなたは必要なだけ、 キャッシュの設定ができます。そして、複数のキャッシュエンジンを使用できます。 CakePHP は、2つの内部的なキャッシュの設定を使用します。 _cake_core_ は、 ファイル構成の保存と、 国際化と地域化 ファイルの結果のパースに使用されます。 _cake_model_ は、アプリケーション上のモデルに対する スキーマの説明を保存するために使用されます。もし、 APC や Memcached を使用している場合、 コアのキャッシュにはユニークなキーをセットしておくべきです。これは、複数アプリケーションで 別のアプリケーションのキャッシュデータを上書きしてしまうのを避けてくれます。

複数の設定を使用することで、必要なだけストレージを変更できます。 例えば、以下のように config/app.php に設定できます。

// ...
'Cache' => [
    'short' => [
        'className' => 'File',
        'duration' => '+1 hours',
        'path' => CACHE,
        'prefix' => 'cake_short_'
    ],
    // 完全な名前空間つきの名前を使用。
    'long' => [
        'className' => 'Cake\Cache\Engine\FileEngine',
        'duration' => '+1 week',
        'probability' => 100,
        'path' => CACHE . 'long' . DS,
    ]
]
// ...

オプション設定は DSN を指定することもできます。 これは環境変数や PaaS プロバイダーと一緒に動作するときに便利です。

Cache::config('short', [
    'url' => 'memcached://user:password@cache-host/?timeout=3600&prefix=myapp_',
]);

DSN を使用するとき、追加のクエリー文字列要素としてパラメーターやオプションが定義できます。

実行時におけるキャッシュエンジンの設定もできます。

// 短い名前で
Cache::config('short', [
    'className' => 'File',
    'duration' => '+1 hours',
    'path' => CACHE,
    'prefix' => 'cake_short_'
]);

// 完全な名前空間つきの名前を使用。
Cache::config('long', [
    'className' => 'Cake\Cache\Engine\FileEngine',
    'duration' => '+1 week',
    'probability' => 100,
    'path' => CACHE . 'long' . DS,
]);

// オブジェクトで
$object = new FileEngine($config);
Cache::config('other', $object);

‘short’ や ‘long’ という設定名は Cake\Cache\Cache::write()Cake\Cache\Cache::read()$config パラメーターとして使われます。 キャッシュエンジンを設定する場合は、次の構文を使用してクラス名を参照することができます。

  • ‘Engine’ または名前空間を含まない短いクラス名。これは、あなたが使いたいキャッシュエンジンを Cake\Cache\EngineApp\Cache\Engine のどちらかであると推測します。
  • プラグイン記法 は、特定のプラグインからエンジンをロードすることを可能にします。
  • 完全に修飾された名前空間つきのクラス名は、従来の場所の外に位置するクラスの使用を可能にします。
  • CacheEngine クラスを継承したオブジェクト。

注釈

FileEndine 使用時に、正しいパーミッションでのキャッシュファイルを指定して作成するには、 mask オプションの設定が必要です。

設定されたキャッシュエンジンを削除する

static Cake\Cache\Cache::drop($key)

一度設定が作成されたら、変更することはできません。代わりに、 Cake\Cache\Cache::drop()Cake\Cache\Cache::config() を使用して、設定を削除して再作成する必要があります。キャッシュエンジンを削除すると、設定が削除され、 アダプターが構築されていれば破棄されます。

キャッシュへの書き込み

static Cake\Cache\Cache::write($key, $value, $config = 'default')

Cache::write() はキャッシュに $value を書き込みます。 この値は後で $key で参照したり、削除したりすることができます。 オプションの設定を指定して、キャッシュを保存することもできます。 $config を指定しない場合、デフォルトが使用されます。 Cache::write() はあらゆるタイプのオブジェクトを格納することができ、 以下のようにモデルの結果を格納するのに理想的です。

if (($posts = Cache::read('posts')) === false) {
    $posts = $someService->getAllPosts();
    Cache::write('posts', $posts);
}

Cache::write()Cache::read() を使用して、データベースへのアクセスを減らし、 posts を取得しています。

注釈

CakePHP ORM で作成したクエリーの結果をキャッシュする場合は、 ロードされた結果をキャッシュする セクションで説明しているように、Query オブジェクトのビルトインキャッシュ機能を使用する方が良いです。

一度に複数のキーを書き込む

static Cake\Cache\Cache::writeMany($data, $config = 'default')

一度に複数のキャッシュキーを書き込む必要が出るかもしれません。 write() を複数回呼び出すこともできますが、 writeMany() は CakePHP がより効率的なストレージ API を使用できるようにします。 例えば Memcached を使用する場合、 writeMany() を使用して、 複数回のネットワーク接続を節約できます。

$result = Cache::writeMany([
    'article-' . $slug => $article,
    'article-' . $slug . '-comments' => $comments
]);

// $result は以下を含みます
['article-first-post' => true, 'article-first-post-comments' => true]

Read-through キャッシュ

static Cake\Cache\Cache::remember($key, $callable, $config = 'default')

Cache を使用すると、Read-through キャッシュを簡単に行うことができます。 指定されたキャッシュキーが存在する場合、それが返されます。 キーが存在しない場合、呼び出し可能オブジェクトが呼び出され、結果がキャッシュに格納されます。

たとえば、リモートサービスコールの結果をキャッシュすることがよくあります。 あなたはこれをシンプルにするために remember() を使うことができます。

class IssueService
{

    public function allIssues($repo)
    {
        return Cache::remember($repo . '-issues', function () use ($repo) {
            return $this->fetchAll($repo);
        });
    }

}

キャッシュからの読み込み

static Cake\Cache\Cache::read($key, $config = 'default')

Cache::read() は、 $key 配下に格納されたキャッシュされた値を $config から読み込むために使用されます。 $config が null の場合、 デフォルトの設定が使用されます。 Cache::read() は、有効なキャッシュであれば キャッシュされた値を返し、キャッシュが期限切れになっているか存在しない場合は false を返します。 キャッシュの内容は false と評価される可能性があるので、必ず厳密な比較演算子 === または !== を使用してください。

例:

$cloud = Cache::read('cloud');

if ($cloud !== false) {
    return $cloud;
}

// クラウドデータを生成する
// ...

// キャッシュにデータを保存する
Cache::write('cloud', $cloud);
return $cloud;

一度に複数のキーを読み込む

static Cake\Cache\Cache::readMany($keys, $config = 'default')

一度に複数のキーを書き込んだ後、あなたは恐らくそれらを同様に読み込みたいでしょう。 read() を複数回呼び出すこともできますが、 readMany() は CakePHP が より効率的なストレージ API を使用できるようにします。例えば Memcached を使用している場合、 readMany() を使用して、複数回のネットワーク接続を節約できます。

$result = Cache::readMany([
    'article-' . $slug,
    'article-' . $slug . '-comments'
]);
// $result は以下を含みます
['article-first-post' => '...', 'article-first-post-comments' => '...']

キャッシュからの削除

static Cake\Cache\Cache::delete($key, $config = 'default')

Cache::delete() を使うと、キャッシュされたオブジェクトをストアから完全に削除できます。

// キーの削除
Cache::delete('my_key');

一度に複数のキーの削除

static Cake\Cache\Cache::deleteMany($keys, $config = 'default')

一度に複数のキーを書き込んだら、それらを削除したいかもしれません。 delete() を複数回呼び出すこともできますが、 deleteMany() は CakePHP が より効率的なストレージ API を使用できるようにします。例えば Memcached を使用している場合、 deleteMany() を使用して、複数回のネットワーク接続を節約できます。

$result = Cache::deleteMany([
    'article-' . $slug,
    'article-' . $slug . '-comments'
]);
// $result は以下を含みます
['article-first-post' => true, 'article-first-post-comments' => true]

キャッシュデータのクリア

static Cake\Cache\Cache::clear($check, $config = 'default')

キャッシュ設定から、すべてのキャッシュされた値を破棄します。Apc、Memcached、Wincache などのエンジンでは、キャッシュ設定のプレフィックスを使用してキャッシュエントリーを削除します。 異なるキャッシュ設定には異なる接頭辞が付いていることを確認してください。

// 有効期限切れのキーのみをクリアする。
Cache::clear(true);

// すべてのキーをクリアする。
Cache::clear(false);
static Cake\Cache\Cache::gc($config)

キャッシュ設定内のガベージコレクトエントリー。これは主に FileEngine で使用されます。 キャッシュされたデータを手動で削除する必要のある任意のキャッシュエンジンによって実装される必要があります。

注釈

APC と Wincache は、ウェブサーバーと CLI 用に分離されたキャッシュを使用するため、 別々にクリアする必要があります。(CLI ではウェブサーバーのキャッシュをクリアできません)

キャッシュを使用してカウンターを保存する

static Cake\Cache\Cache::increment($key, $offset = 1, $config = 'default')
static Cake\Cache\Cache::decrement($key, $offset = 1, $config = 'default')

アプリケーション内のカウンターは、キャッシュに保存するのに適しています。 例として、コンテストの残りの「枠」の単純なカウントダウンをキャッシュに格納することができます。 Cache クラスは簡単な方法でカウンター値をインクリメント/デクリメントするアトミックな方法を公開しています。 競合のリスクを軽減し、同時に2人のユーザーが値を1つ下げて誤った値にする可能性があるため、 これらの値にはアトミック操作が重要です。

整数値を設定した後、 increment() および decrement() を使用して整数値を操作できます。

Cache::write('initial_count', 10);

// 設定した後に
Cache::decrement('initial_count');

// または
Cache::increment('initial_count');

注釈

インクリメントとデクリメントは FileEngine では機能しません。 代わりに、APC、Wincache、Redis または Memcached を使用する必要があります。

キャッシュを使用して共通のクエリー結果を格納する

まれにしか変更されない、またはキャッシュに大量の読み込みが行われるような結果をキャッシュすることによって、 アプリケーションのパフォーマンスを大幅に向上させることができます。 この完璧な例は、 Cake\ORM\Table::find() の結果です。 この Query オブジェクトを使用すると、 cache() メソッドを使用して結果をキャッシュできます。 詳細は、 ロードされた結果をキャッシュする セクションを参照してください。

グループの使用

たまに、複数のキャッシュエントリーを特定のグループまたは名前空間に属するようにマークしたい場合があります。 同じグループ内のすべてのエントリーで共有される情報が変更されるたびに、キーを大量に無効化したいというのは 一般的な要件です。これは、キャッシュ設定でグループを宣言することで可能です。

Cache::config('site_home', [
    'className' => 'Redis',
    'duration' => '+999 days',
    'groups' => ['comment', 'article']
]);
Cake\Cache\Cache::clearGroup($group, $config = 'default')

ホームページに生成された HTML をキャッシュに保存したいが、 コメントや投稿がデータベースに追加されるたびにこのキャッシュを自動的に無効にしたいとします。 commentarticle グループを追加することで、このキャッシュ設定に保存されているキーに、 両方のグループ名で効果的にタグを付けできます。

たとえば、新しい投稿が追加されるたびに、 article グループに関連付けられたすべてのエントリーを 削除するように Cache エンジンに指示できます。

// src/Model/Table/ArticlesTable.php
public function afterSave($event, $entity, $options = [])
{
    if ($entity->isNew()) {
        Cache::clearGroup('article', 'site_home');
    }
}
static Cake\Cache\Cache::groupConfigs($group = null)

groupConfigs() を使用すると、グループと設定の間のマッピングを取得できます。 つまり、同じグループを持ちます。

// src/Model/Table/ArticlesTable.php

/**
 * すべてのキャッシュ設定をクリアする前述の例のバリエーション
 * 同じグループを持つ
 */
public function afterSave($event, $entity, $options = [])
{
    if ($entity->isNew()) {
        $configs = Cache::groupConfigs('article');
        foreach ($configs['article'] as $config) {
            Cache::clearGroup('article', $config);
        }
    }
}

グループは、同じエンジンと同じ接頭辞を使用して、すべてのキャッシュ設定で共有されます。 グループを使用していて、グループの削除を使用する場合は、すべての設定の共通プレフィックスを選択します。

全体的にキャッシュを有効または無効にする

static Cake\Cache\Cache::disable

キャッシュの有効期限に関連する問題を把握しようとするときに、 キャッシュの読み込みと書き込みをすべて無効にする必要があります。 enable()disable() を使ってこれを行うことができます。

// すべてのキャッシュ読み取りとキャッシュ書き込みを無効にする。
Cache::disable();

無効にすると、すべての読み込みと書き込みは null を返却します。

static Cake\Cache\Cache::enable

無効にすると、 enable() を使用してキャッシュを再び有効にすることができます。

// すべてのキャッシュの読み込みと書き込みを再び有効にする。
Cache::enable();
static Cake\Cache\Cache::enabled

もしキャッシュの状態を確認する必要がある場合は、 enabled() を使用してください。

キャッシュ用ストレージエンジンの作成

App\Cache\Engine$plugin\Cache\Engine を使用してカスタムした Cache のアダプターをプラグインとして提供することができます。 src/plugin キャッシュエンジンは、コアエンジンをオーバーライドすることもできます。 キャッシュアダプターはキャッシュディレクトリー内になければなりません。 MyCustomCacheEngine という名前のキャッシュエンジンがあれば、 app/libs として src/Cache/Engine/MyCustomCacheEngine.php に置かれます。 または、プラグインの一環として、 plugin/Cache/Engine/MyCustomCacheEngine.php に置かれます。 プラグインのキャッシュ設定は、プラグインドット構文を使用する必要があります。

Cache::config('custom', [
    'className' => 'CachePack.MyCustomCache',
    // ...
]);

カスタムキャッシュエンジンは、いくつかの抽象メソッドを定義するだけでなく、 いくつかの初期化メソッドを提供する Cake\Cache\CacheEngine を拡張する必要があります。

キャッシュエンジンに必要な API は次のとおりです。

class Cake\Cache\CacheEngine

Cache で使用されるすべてのキャッシュエンジンの基本クラス。

Cake\Cache\CacheEngine::write($key, $value, $config = 'default')
戻り値:成功時に boolean

キーの値をキャッシュに書き込みます。 省略可能な文字列 $config は、書き込む設定名を指定します。

Cake\Cache\CacheEngine::read($key)
戻り値:キャッシュ値または失敗時に false

キャッシュからキーを読み取ります。 エントリーが期限切れまたは存在しないことを示す場合は false を返します。

Cake\Cache\CacheEngine::delete($key)
戻り値:Boolean 成功時に true

キャッシュからキーを削除します。 エントリーが存在しなかったか、削除できなかったことを示す場合は false を返します。

Cake\Cache\CacheEngine::clear($check)
戻り値:Boolean 成功時に true

キャッシュからすべてのキーを削除します。 $check が true の場合、各値が実際に期限切れであることを検証する必要があります。

Cake\Cache\CacheEngine::clearGroup($group)
戻り値:Boolean 成功時に true

同じグループに属するキャッシュからすべてのキーを削除します。

Cake\Cache\CacheEngine::decrement($key, $offset = 1)
戻り値:Boolean 成功時に true

キー配下の数字をデクリメントし、デクリメントされた値を返します。

Cake\Cache\CacheEngine::increment($key, $offset = 1)
戻り値:Boolean 成功時に true

キー配下の数字をインクリメントし、インクリメントされた値を返します。

Cake\Cache\CacheEngine::gc()

必須ではありませんが、リソースの有効期限が切れたときにクリーンアップするために使用されます。 FileEngine はこれを使用して、期限切れのコンテンツを含むファイルを削除します。