開発畑トップ   »  PHP   »  今日からプログラマー!PHP入門【テンプレートエンジン作成編】   »  今日からプログラマー!PHP入門(第13回)

今日からプログラマー!PHP入門(第13回)

おはようございますー
そういえば、6月14日にこのようなセミナーがあります。

西日本縦断! GMOクラウド Publicセミナー ~今こそ、ホスティングからクラウドへ乗り換えよう!~
「Gartner Predicts 2012」の発表によりますと、今後のクラウド市場の展望として「2016年末には、Global 1000企業の半数以上が顧客に関する機密データをパブリック・クラウドに格納するようになる」と予想されています。ますます注目を浴びるパブリック・クラウドへの需要は日々伸びており、今、自社サーバーやホスティングからクラウド移行へ踏み切る企業数が急速に増加しています。 本セミナーでは、西日本におけるクラウド導入促進を担うGMOクラウドWEST株式会社の営業責任者が、オンプレミス(従来の専用サーバー等)をクラウド化するメリットやクラウドの活用方法をご提案させていただきます。

ちょっと気になるので、行ってきます(^-^)
※これを機に自宅サーバーをこっちに全移行とか出来たらecoかなぁとか考え中~

さて、では今回もはじめますよ!「今日からプログラマーPHP入門(第13回)」です。


今回はテンプレートエンジンのキャッシュについて実装を考えていきましょう。

テンプレートエンジンのキャッシュを考える

まずは、テンプレートファイルをキャッシュ化するにあたり、どの段階でのキャッシュを取得するかを考えてみましょう。

  • レベル1:テンプレートファイルそのまま
  • レベル2:テンプレートタグをphp関数に変換した時点
  • レベル3:出力直前のデータ

キャッシュ化するにあたり、何に重点を置くか

キャッシュのレベルによって一長一短があるので、どれがいいとは言えないのですがここでは「速さ」に重点を置いて考えてみます。
その場合、キャッシュレベル3の出力直前のデータをキャッシュすれば一番速いですね。

では、キャッシュレベル3を実装することで考えられる問題点を書きだしてみましょう。

  • テンプレートファイルの中身が変わった場合はキャッシュを新しくする必要がある
    ※要は「デザイン(HTML)を変えたらキャッシュも新しくしないとね」という事
  • テンプレートファイルに入れるデータが変わった場合はキャッシュを新しくする必要がある
    ※ブログを例にとると、「新しく記事を書いたらキャッシュも新しくしないとね」という事

テンプレートエンジン側でする処理

テンプレートエンジン側で上記の問題点をすべて自動で判断して処理すると逆に時間がかかったりします。
なので、キャッシュを新しくするタイミングについて以下のようにしてみます。

  • テンプレートファイル(HTML)が変わったかどうかは、元のテンプレートファイルと新しいテンプレートファイルを比較すればいいだけなので、これはテンプレートエンジン側で自動判断をしてキャッシュを生成する
    ※PHPのmd5_file()関数を使ってMD5ハッシュ値を比較すれば簡単にできる
  • データが新しくなったかどうかは処理の後半(テンプレートファイルにデータを置換する部分)でないと分からないので、自動処理は行わずプログラマーに任せる
    ※キャッシュ破棄・キャッシュ生成の関数を作ってプログラマーの望むタイミングで処理を実行してもらう

テンプレートエンジンにキャッシュを実装

では実装するにあたり、どのようなクラスメソッド(関数)が必要になるのか書き出していきましょう。

  • キャッシュのON/OFFは切り替えられるようにしたいので、キャッシュ切替用の関数がいる
  • キャッシュはファイルとして保存するため、キャッシュ保存用のディレクトリを指定できるような関数がいる
  • テンプレートファイル読み込み時(tplSetup関数)を改良して、「キャッシュがあるかどうか、あるなら今のファイルと比較して新しく作り直すかどうかを判断する」処理を追加する
  • キャッシュファイルを破棄する関数がいる
  • キャッシュを生成する関数は、tplSetup関数を改良する際に、「キャッシュが無い場合は自動で生成」することで対応する

で、作成したプログラムがこちら[imapro13.zip]になります。
ファイルは圧縮されていますので、適宜解凍してご使用ください。
使い方は前回同様、解凍してそのままサーバーにアップして、index.phpをブラウザから見るだけです。

index.phpをブラウザで見ると、各テンプレートタグの処理がずらずらーっと表示されて、cache mode[off]の場合とcache mode[on]の場合の処理時間が表示されます。
見ていただくと分かるのですが、cache mode[on]の方が断然早いです。
私がローカルサーバーでテストした結果は以下の通りでした。

string(41) "cache mode [off] time: 0.0024290084838867"
string(41) "cache mode [on] time: 0.00071001052856445"

※ひとケタ違いますね(^-^)v

では、次回は作成したキャッシュ処理の部分の解説をしていこうと思います。
それほどコード追加修正してないので、気になる方はコード見ておいてくださいませ

では、次回に続きますー

今回覚えた関数

コメントをどうぞ!