CakePHP 4 のキャッシュクリアと無効化の方法

はじめに

CakePHP 4 では初期設定でモデルと翻訳データはキャッシュを使うようになっており、そのファイルを消さないと変更が反映されないことがあります。

キャッシュファイルは /tmp/cache の中にあるのですが、都度手作業でファイルを削除するのは手間だったりするんですよね。

今日は CakePHP 4 のコマンドや PHP コード内でキャッシュを削除する方法と、設定でキャッシュを無効化する方法をご紹介します。

cakephp/cakephp
4.1.6
cakephp/app
4.1.2
目次
  1. コマンドで全クリア
  2. コマンドで個別削除
    1. 翻訳のキャッシュ削除
    2. モデルのキャッシュ削除
    3. ルーティングのキャッシュ削除
    4. cache clear コマンドについて
  3. コード内でキャッシュ削除
  4. 無効化の設定方法
  5. おわりに

1. コマンドで全クリア

$ bin/cake cache clear_all

少なくとも開発環境ではこのコマンドで OK だと思います。

削除ができない場合、僕の経験ではキャッシュファイルのパーミッションが原因であることが多いです

2. コマンドで個別削除

キャッシュの設定を変更されている方は「2-4. cache clear コマンドについて」を参考にしてください。

2-1. 翻訳のキャッシュ削除

$ bin/cake cache clear _cake_core_

翻訳のキャッシュは /tmp/cache/persistent の中にあります。

2-2. モデルのキャッシュ削除

$ bin/cake cache clear _cake_model_

モデルのキャッシュは /tmp/cache/models の中にあります。

2-3. ルーティングのキャッシュ削除

$ bin/cake cache clear _cake_routes_

ルーティングのキャッシュは Application.php にある new RoutingMiddleware() の第二引数にキャッシュ設定名を指定した場合に有効になります。

設定名として _cake_routes_ を指定すると、キャッシュファイルが
/tmp/cache/myapp_cake_routes_●●● という形で作られ、
上記コマンドではこのファイルを削除します。

2-4. cache clear コマンドについて

cache clear コマンドは、指定したキャッシュ設定のファイルを削除するもので、前述の通り下記のように入力します。

$ bin/cake cache clear [キャッシュ設定名]

[キャッシュ設定名] には app.php などで設定した Cache の設定名(キー)が入ります。

例えば app.php の Cache にある default で指定されたキャッシュを削除する場合は、下記のように入力します。

$ bin/cake cache clear default

キャッシュ設定名はコマンドでも確認できます。

$ bin/cake cache list
- default
- _cake_core_
- _cake_model_
- _cake_routes_

設定名を変更したり、追加した場合には上記リストの内容も変わります。

削除対象のファイルは、設定項目の path だけでなく prefix (ファイル名の先頭に付ける文字列) も影響してきます。

例えば指定 path の中に prefix と一致しないファイルが存在する場合は、それは削除されません。

3. コード内でキャッシュ削除

プログラム内でキャッシュを削除する場合には Cache::clear() 関数が使えます。

引数には設定名を指定し、省略すると default のキャッシュが削除されます。

<?php
// ↓ 追加を忘れずに
use Cake\Cache\Cache;

// '_cake_core_' のキャッシュを削除
Cache::clear('_cake_core_');

// 'default' のキャッシュを削除
Cache::clear();

4. 無効化の設定方法

キャッシュの無効化は app_local.php で、下記のように classNameNullEngine を指定すれば実現できます。

/config/app_local.php
<?php
// ↓ 追加
use Cake\Cache\Engine\NullEngine;
...
    // ↓ 追加
    'Cache' => [
        '_cake_core_' => [
            'className' => NullEngine::class
        ],
        '_cake_model_' => [
            'className' => NullEngine::class,
        ],
    ],

app.php に書いても大丈夫ですが、本番環境で有効にする場合には app_local.php に書くのが良いと思います。

注意点として NullEngine を指定すると cache clear コマンドを使っても当該ファイルが削除されないので、事前に削除、手動削除、FileEngine に戻して cache clear を実行、などで対応してください。

余談ですが NullEngine も含め各種エンジンは下記フォルダにあります。

/vendor/cakephp/cakephp/src/Cache/Engine

5. おわりに

キャッシュファイルは手動で消しても特に問題ないと思いますが、
コマンドを覚えると作業が楽になり、そして早く行えます。

習得の優先順位としては低いかもしれませんが、今はその余裕がなくても、何かの時に思い出して少しずつ使っていただけるとスキルアップにつながると思います。