View Cache のキャッシュファイル名を変更する

posted 2010-07-26 | written by mon_sat

久しぶりに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')) {

以上です。

もっとエレガントなやり方がありそうだけど、とりあえず。

<< previous
|
next >>

プロフィール

@mon_sat

CakePHPをよく利用しています。

理解の浅かった半年前と、何も知らなかった一年前の自分への教科書として書いています。
当たり前のことも平易に。

RSS2.0

カテゴリ別エントリ一覧

タグ別エントリ一覧

アーカイブ