CakePHP の自動キャッシュクリアが効くのは、コントローラ名=モデル名のときだけ

最近、CakePHPという、PHPのRuby on Rails的なフレームワークをゴリゴリいじっています。

Cakeにはビューのキャッシュ機構があり、モデルの更新(Insert,update,delete)があるとそのモデルを使ったコントローラのビューのキャッシュを自動削除してくれるということが、なんとなくマニュアルに書かれています。

自動削除されるのはモデルとその関連モデルの名前のコントローラだけ

僕はてっきりコントローラで使われるモデルのどれかがあれば自動削除されると思ったのですがそうではなく、モデル名のprefixがついたコントローラ(例えばコントローラ名=モデル名)で作られたキャッシュのみクリアが行われるようでした。cake/libs/mode/model_php5.phpの_clearCacheメソッドを追ってみたところ、そのモデルとbelongsToやhasManyなどで関連したモデル名の配列をclearCache関数に渡していました。

これは、例えばEntryモデルであれば

clearCache(array('entries'))

で、EntryモデルがCommentモデルをhasManyしていれば

clearCache(array('entries', 'comments'))

になります。entries_controller.phpcomments_controller.phpで作られたキャッシュがあれば、クリアされるということです。

$usesで指定した場合は対象外

しかし例えばtoppage_controller.phpの中で

class TopPageController extends AppController {
var $name = "TopPage";
var $uses = array('Entry', 'Comment');
var $cacheAction = 86400;

としてビューキャッシュを使った場合はキャッシュのprefixはtoppageになるので、EntryやCommentが更新されても自動削除は行われません。この場合は、自前でclearCacheを呼び出す必要があります。

というか、そのあたりを意識してコントローラ名のprefixをモデル名にすることはあまり建設的とはいえませんので、expireされるまで待たないのであれば自前で削除が基本っぽいですね。

がんばれば自動削除できるかも

このあたりを自動でやってくれると非常にありがたいですね。想像上ではcontrollerファイルを全部読み込んで$usesをみればできそうな気がするので、挑戦してみようと思います。

どのコントローラがどのモデルを使用しているかが明示されているというのは、便利なものですね。フレームワークのメリットを感じました。

確認したCakePHPのバージョンは1.1.14.4797です。

コメント / トラックバック

コメント / トラックバック 2 件

  1. shun より:

    「どこまで自動にするか」というさじかげんは、フレームワークの設計の難しい点ですね。完全「自動削除」、できたらぜひ教えてください!

  2. [...] CakePHP の自動キャッシュクリアが効くのは、コントローラ名=モデル名のときだけ : akiyan.com ↑という時用 behaviorsで指定すれば多少ましかもしれないと思った。 [...]