CakePHPにはキャッシュを行う関数cache()があるのですが、1.2.2のソースを見るとdeprectatedになってました。
[cake/basics.php]
PHP:
-
<?php
-
/**
-
* Reads/writes temporary data to cache files or session.
-
*
-
* @param string $path File path within /tmp to save the file.
-
* @param mixed $data The data to save to the temporary file.
-
* @param mixed $expires A valid strtotime string when the data expires.
-
* @param string $target The target of the cached data; either 'cache' or 'public'.
-
* @return mixed The contents of the temporary file.
-
* @deprecated Please use Cache::write() instead <---ココ
-
*/
-
function cache($path, $data = null, $expires = '+1 day', $target = 'cache') {
-
?>
代わりにCache::write()を使えとのことなので、cache()とCache::write()との違いを見てみました。
1. キャッシュエンジンが選べる
これが一番の違いかと。
cache()ではキャッシュの保存先にはファイルしか選べません。おかげで単純な実装で分かり易いという利点もあるのですが、APCやmemcachedなどにキャッシュを保存できません。
Cache::write()では[app/config/core.php]で設定を行えば、APC/XCache/Memcacheと色々なキャッシュエンジンを選ぶことができます。特にMemcacheではサーバを分散させた時にキャッシュをサーバ間で共有できるので、これは良いです。
パフォーマンスもファイルよりAPC等の方が良いです。
2. 連想配列やオブジェクトがそのままキャッシュできる
cache()ではキャッシュの保存にfile_put_contents()を使っているので、連想配列やオブジェクトをキャッシュする際はserialize()が必要でした。(逆に取得したキャッシュを使うにはunserialize()が必要。)
Cache::write()では連想配列でもオブジェクトでもそのままキャッシュしてくれます。これもちょっとしたことですが、便利です。
3. キャッシュ有効期限が手軽に変更できなくなった
cache()では第3引数がキャッシュ有効期限となっているので、cache()の呼び出し毎にキャッシュ有効期限を設定することが簡単でした。
Cache::write()では引数でキャッシュ有効期限を渡すことができないようで、[app/config/core.php]等にCache::config()を使って、あらかじめ有効期限を設定しておく必要があります。
PHP:
-
<?php
-
Cache::
config('default',
array(
-
'engine' => 'Apc', //[required]
-
'duration'=> 10, //[optional] <----キャッシュ有効期間(秒)
-
'probability'=> 100, //[optional]
-
'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string
-
));
-
Cache::
config('app',
array(
-
'engine' => 'Apc', //[required]
-
'duration'=> 360, //[optional] <----キャッシュ有効期間(秒)
-
'probability'=> 100, //[optional]
-
'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string
-
));
-
?>
上記例なら'default'なら10秒、'app'なら360秒がキャッシュの有効期間となります。
ビューキャッシュはcache()のまま
キャッシュと言えばビューの出力をキャッシュするビューキャッシュがあるのですが、こちらは1.2.2でもキャッシュの保存にcache()を利用しています。つまり、キャッシュエンジンをAPC等に変更してもビューキャッシュだけはファイルに保存されます。
複数サーバでビューキャッシュを共有したい時はビューの出力をフックしてCache::write()でキャッシュするなど、一工夫が要りそうです。
deprecatedとするなら、まずフレームワークで実行するビューキャッシュCache::write()にすべきだとは思うのですが、これはいずれは実装されるのでしょう。