app/Config/core.phpのCacheの初期値はapp/Config/bootstrap.phpで上書きできないのですね

CakePHPを使っている時、app/Config/core.phpはcake本体のupdateのタイミングで変更される可能性があるためapp/Config/bootstrap.php

<?php
config(
    'bootstrap.core.session', 
    'bootstrap.core.routing', 
    'bootstrap.core.security', 
    'bootstrap.core.cache'
);

みたいなことを書いてcoreの初期値を上書きするようにしていたのですが、
CakePHP本体で利用する_cake_core_と_cake_model_のcacheがApcのままになってしまってることに気づきしばらくハマってしまいました。



で、調べてみたらCache::config()の時点でcacheのenginが決定されてしまい、その後は変更できないのですね。



実際、cakephp/lib/Cake/Cache/Cache.phpのconfig()を見てみると

136         if (!isset(self::$_engines[$name])) {
137             self::_buildEngine($name);
138             $settings = self::$_config[$name] = self::settings($name);
139         } elseif ($settings = self::set(self::$_config[$name], null, $name)) {
140             self::$_config[$name] = $settings;
141         }

となっていて、$name(例えば_cake_core_)のengineが

  • まだ指定されていなければ_buildEngine()を呼び出し初期化
  • 指定されていればその設定を$settings変数の値に上書き

ということをやっていると。



その_buildEngine()の中では

165         self::$_engines[$name] = new $cacheClass();

という感じで$nameキーに対して指定されたcacheエンジン(core.phpの場合はApc)の初期化を行っていて、
これ移行の処理でconfig()の中でcacheエンジンは上書きされない。



ということで、bootstrapの中で

<?php
$engine = 'File';
$namespace = implode('.', array_reverse(explode('.', 'example.com')));
$duration = '+0 seconds';
Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => $namespace . '.cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration
));

みたいにCache::config()を実行しても'engine'の部分は無視されてしまうのですね。
app/Config/core.php自体を書き換えるようにします。

追記

と、思ったけど、

<?php
$engine = 'File';
$namespace = implode('.', array_reverse(explode('.', 'example.com')));
$duration = '+0 seconds';
Cache::drop('_cake_core_');
Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => $namespace . '.cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration
));

みたいにCache::dropで設定を捨てちゃえばいいのか。それでいこう。