View Cache のキャッシュファイル名を変更する
久しぶりにCakePHPネタを。
ひとつのAPPで複数のサイトを運営しているAPPがあります。
bootstrap.php内でURL等を見てどのサイトかを判断しているのですが、キャッシュを設定して困りました。
aaa.example.com/index と bbb.example.com/index で生成されるキャッシュファイルが同じになってしまいます。
どちらへアクセスしても先にキャッシュされたファイルを表示してしまうのです。
しかたがないので、以下のようにキャッシュを生成することを試みました。
aaa_index.php
bbb_index.php
キャッシュヘルパーを上書きする
コアのキャッシュヘルパーをコピーする
コアのキャッシュヘルパーを、APP内にコピーします。
cp cake/libs/view/helpers/cache.php app/views/helpers
キャッシュヘルパーを書き換える
キャッシュヘルパーで書き換える箇所は1箇所です。
キャッシュを書き出している __writeFile() の↓に1行追加します。
# app/views/helpers/cache.php
# __writeFile()
$path = $this->here;
if ($this->here == '/') {
$path = 'home';
}
$path = Configure::read("subdomain") . "/" . $path; // この行を追加
$cache = strtolower(Inflector::slug($path));
subdomain はbootstrap.php にて設定してください。
この状態でURLにアクセスすると、aaa_index.phpのように、サブドメインが付加されてキャッシュファイルが作られます。
しかし、このままではdispatcherがキャッシュファイルを認識してくれません。
Dispatcher等を修正する
dispatcherの該当箇所を書き換える前に、dispatcherをコピーし、そのファイルを読むように変更しなくてはなりません。
CakePHP1.2であれば、この記事内のスライドが参考になります。
しかし、CakePHP1.3 (1.3.0)の場合、dispathcerはキャッシュしてくれないようです。
以下のように対処します。
DispatcherとBootstrapをコピーする
CakePHP1.3から登場のAPP/libsディレクトリに、コアのdispatcher.php とbootstrap.php をコピーします。
cp cake/libs/dispatcher.php app/libs cp cake/libs/bootstrap.php app/libs
Dispatcherを書き換える
cached() 内に、1行追加します。
# app/libs/dispatcher.php
# cached()
$path = $this->here;
if ($this->here == '/') {
$path = 'home';
}
$path = Configure::read("subdomain") . "/" . $path; // この行を追加
$path = strtolower(Inflector::slug($path));
次に、当Dispatcherを読み込むように修正します。
app/config/bootstrap.php にて、dispatcherの読み込み先を変更する
bootstrap.phpの最後の方に、下記を加えます。
# app/config/bootstrap.php
App::import('Lib', 'Dispatcher');
このままでは、コアのDispatcherも読みにいってしまうようですので、それを止めます。↓
Bootstrapを書き換える
コアからコピーしたapp/libs/bootstrap.phpを書き換えます。
(app/config内のbootstrap.phpではありません)
# app/libs/bootstrap.php # 最後の行をコメントアウト // require CAKE . 'dispatcher.php';
最後に、webroot/index.phpのbootstrap.phpの読み込みを変更します。
webroot/index.phpを書き換える
# app/webroot/index.php
# 次のように変更します
//if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) {
if (!include(APP_PATH . 'libs' . DS . 'bootstrap.php')) {
以上です。
もっとエレガントなやり方がありそうだけど、とりあえず。