💨

CakePHPでクエリのResultSetをデフォルト設定でキャッシュした場合、有効期間はどれくらい?

2022/08/31に公開

業務でCakePHPのクエリキャッシュを使用する機会があり、デフォルト設定でコーディングしていましたが、デフォルト設定の場合のキャッシュの有効期間が曖昧だったため備忘録として残します!

クエリ結果のキャッシュ方法

$query->cache('recent_companies');

これだけでクエリのResultSetのキャッシュが有効になります。
もしcache()に1つだけの引数を渡した場合は、'default'のキャッシュ・コンフィグが使われることになります。
独自の設定を使用したい場合は、第2引数でキャッシュ・コンフィグを指定できます。

// 文字列でConfig名を指定する
$query->cache('recent_companies', 'dbResults');

// CacheEngineのインスタンスを指定する
$query->cache('recent_companies', $memcache);

(本題)デフォルト設定でキャッシュした際の有効期間はどれくらい?

config/app.php
'Cache' => [
    'default' => [
        'className' => 'File',
        'path' => CACHE,
        'url' => env('CACHE_DEFAULT_URL', null),
    ],

    '_cake_core_' => [
        'className' => 'File',
        'prefix' => 'myapp_cake_core_',
        'path' => CACHE . 'persistent/',
        'serialize' => true,
        'duration' => '+1 years',
        'url' => env('CACHE_CAKECORE_URL', null),
        'mask' => 0666,
    ],

    '_cake_model_' => [
        'className' => 'File',
        'prefix' => 'myapp_cake_model_',
        'path' => CACHE . 'models/',
        'serialize' => true,
        'duration' => '+1 years',
        'url' => env('CACHE_CAKEMODEL_URL', null),
        'mask' => 0666,
    ],
],

config/app.phpファイルを見ると_cake_core_ _cake_model_ にはdurationオプションが設定されており、キャッシュの有効期間が1年であることがわかります。

_cake_core_ : ファイル構成の保存と、国際化と地域化ファイルの結果のパースに使用
_cake_model_ : アプリケーション上のモデルに対するスキーマの説明を保存するために使用
durationオプション: キャッシュ設定内のアイテムの有効期間を指定

しかし、defaultにはdurationオプションが設定されていません。
では、デフォルト設定のキャッシュ有効期間はどれくらいなのでしょうか?

答えはvendor/cakephp/cakephp/src/Cache/Engineディレクトリ配下で確認できます!
Engineディレクトリ配下には組み込みのキャッシュエンジンに対応したファイルが格納されており、各キャッシュエンジンの設定やメソッドが確認できます。

defaultではFileEngineが指定されているためEngine/FileEngine.phpの設定を確認します。

FileEngine.php
protected $_defaultConfig = [
    'duration' => 3600,
    'groups' => [],
    'isWindows' => false,
    'lock' => true,
    'mask' => 0664,
    'path' => null,
    'prefix' => 'cake_',
    'probability' => 100,
    'serialize' => true
];

デフォルトコンフィグを確認するとdurationオプションに3600が設定されていることがわかります。
単位を確認するために、試しに5に設定してクエリの発行数を確認すると5秒後にクエリが再発行されるので、単位は「秒」であることがわかります。

よって、デフォルト設定でキャッシュした場合の有効期間は1時間であることがわかりました!

Discussion