【CakePHP】ハイブリッド運用の考察

昨晩から引き続きになりますが、Cake使用でのパフォーマンス改善の究極として「Cakeを使わないでCakeで作ったページを開けないものか?」というものがあります。

トップページなど、ぶっちゃけ処理が不要で表示のみのページは、直接テンプレートをインクルードして表示すればいいわけで、こうするだけでパフォーマンスが30倍は上がります。

実は、webroot直下にfuga.phpを置くことで、普通に「http://hoge.com/fuga.php」を開くことが出来ます。これは、mod_rewriteで、ファイルが存在している場合にはそのまま実行するように記述されているからです。
ところが、ホーム(/)や、「http://hoge.com/fuga」のような形式でアクセスしたい場合、mod_rewriteの設定をしてもうまくいかないようです。fuga.phpそのものは呼び出すことが出来るのですが、その中に記述されているcssやらjsファイルが取得できなくなってしまうのです。
回避する方法はちゃんとあるのかもしれませんが、とりあえずお手軽ということで、index.phpはそのまま読み込んで、指定URLで割り込んでしまうという形式を使うことにします。

まず、ファイルを読み込むためのピュアPHPファイルを用意します。
例えばindex_direct.phpとします。
次のように記述すると、レイアウトに配置されたビューテンプレートを表示できるようになります。

【index_direct.php】
<?php
    ob_start();
    include_once('../views/fuga/index.ctp');
    $content_for_layout =ob_get_clean();
    include_once('../views/layouts/fuga.ctp');
?>

index_direct.phpの置き場所は、webrootでもいいのですが、不要にアクセスされるのも良くないので、vendorsとかに入れておいた方が良いかもしれません。
そしてこのファイルを、index.phpの先頭で呼び出します。

【index.php】
※先頭に次の文を挿入

if($_GET['url'] == ''){  //ホームの場合はブランク
    include_once('./index_direct.php');
    return;
}

if文で、ダイレクトで表示させたいパスの場合分けをします。
GETパラメータを取得したい場合は、preg_match等で必要な部分を抜き出します。POSTは普通にとれると思います。

これで、とりあえずビューテンプレートそのものは表示できます。
問題点は、ヘルパーを使っている場合です。ヘルパーのインスタンスは一切定義されていませんから、エラーになります。また、当然ながらDBのアクセスなど、今までCakeにやってもらっていたものは自前で行わなければなりません。

上記問題さえ克服できれば、ピュアPHPで表示するのと大差ない速さで表示できるようになるので、これはこれで使えるかもしれません。処理の全くない素のページは、基本htmlやformのヘルパーを普通のHTMLの記述に戻す程度で処理を通すことが出来ると思います。

気持ちよくないのは、webroot内のindex.phpを中途半端に書き換える点ですね。
app内であることが救いですけど。
ちなみにapp/config/bootstrap.phpでカスタムな記述をするような慣習がありますが、ここに書いてしまうと基礎的なCakeシステムが読み込まれてたあとでの実行になってしまいますので、試してはいませんがパフォーマンスが食われてしまうのではないかと思います。

以上、裏技的なTipsでした。
こういった逆行する技術無しにCakeのパフォーマンスが上がるといいですね。