今プロPHP今週も何とか更新w(うっかり忘れてたわけですが...)では始めましょう、今日からプログラマー!PHP入門第14回です。今回で一旦テンプレートエンジン編を終了する予定です。次回からの予定はまだ未定なのですが、もうちょっと簡単なものにしようかなと思っています。前回はテンプレートエンジンのキャッシュを実装する方法を考えました。今回は実際に実装したコードを見ていきます。{exit($msg);}}相変わらず長いコードですが、キャッシュに伴うコード追加の部分はそれほど多くありませんので頑張ってコードを追っかけてみましょう1行目PHPの開始タグです。このプログラムコードですが、開始タグに対して終了タグがありません。通常は終了タグも書くのですが、終了タグを書くことによる弊害というのがあってここでは終了タグを書いていません。ManualのPHPタグの箇所にも書いていますのでご一読ください。2行目~10行目コメント行です。この辺は以前と変わりなしです。17行目~42行目コンストラクトメソッドの部分は28行目~30行目に新たな変数を追加しました。それぞれの役割は後で説明します。43行目~47行目デストラクトメソッドの部分は以前と変わらず処理なしです。新たにcacheModeメソッドを追加しました。このメソッドでキャッシュのON/OFFを切り替えます。キャッシュの状態を記憶するために$this->cacheMode変数を使用します。新たにcacheDirメソッドを追加しました。このメソッドでキャッシュの保存先を指定します。キャッシュディレクトリを記憶するために$this->cacheDir変数を使用します。新たにcacheClearメソッドを追加しました。このメソッドでキャッシュの削除を行います。※ユーザーが手動で(プログラム制御で)キャッシュを削除することが出来ます。処理の内容は、キャッシュディレクトリをチェックして、存在していたらキャッシュディレクトリ内のファイルを1件づつ削除するようになっています。前回と同様の処理内容です。78行目~96行目tplSetupメソッドでは、キャッシュが有効の場合の処理を追加しました。82行目でキャッシュが有効かどうかを判別し、有効であれば83行目~91行目の処理を行います。83行目~91行目の処理は以下の通りです。83行目md5_file()関数でテンプレートファイルのMD5値を取得84行目キャッシュディレクトリを取得85行目キャッシュディレクトリ内に上記「MD5値をファイル名に持っている」ファイルがあるか調べる86行目~87行目あれば、$this->cacheLoad変数にtrue(キャッシュ読み込み完了)をセットし、キャッシュファイルを読み込む。88行目~90行目キャッシュディレクトリにキャッシュファイルが無ければ、テンプレートファイルを読み込むキャッシュが無効の場合は92行目~94行目の処理を行います。前回と同様の処理内容です。102行目~218行目tplFetchメソッドもキャッシュ処理のために処理を追加しました。103行目~114行目では、キャッシュが有効で、なお且つキャッシュファイルを読み込んでいる場合(tplSetupメソッドでキャッシュファイルを読み込んだ場合)、そのファイルを返り値として処理します。※キャッシュが有効で、なお且つキャッシュファイルがある場合は以降の処理を行わないため高速化することが出来ます。キャッシュが無効、またはキャッシュファイルがまだ作成されていない場合は以後の処理に続きます。201行目までは従来通りの処理なので、説明は省略します。203行目~211行目までが、新たに追加した処理です。203行目~211行目ではキャッシュが有効だった場合にコンパイルしたデータ(PHPコードに置換したテンプレートファイル)をmd5_file()関数を使ってMD5値を取得して、その値をファイル名としてキャッシュディレクトリに保存します。md5_file()関数は、ファイルの中身が変わればMD5値も変わるので、この値をファイル名にすることで、テンプレートファイルが変更されたかどうかを安易に比較することが出来ます。ahref="http://php.net/manual/ja/function.file-put-contents.php">file_put_contents()関数を使用します。これでキャッシュファイルの保存は完了です。220行目~最後まで以前と同様の処理なので省略これで、キャッシュが完成しました。このキャッシュは最低限のことしかしていませんので、改良する余地は(たくさん)あります。複数のテンプレートファイルを処理する場合に、cacheClearメソッドを使用すると全部のキャッシュが削除されてしまうので、個別に削除する方法を実装するとか。キャッシュの有効期限を作って有効期限切れのキャッシュは自動で削除されるとかほかにも色々とアイディアはあると思いますので、一度ご自身で考えてみて実装してみてください。「こんなの作ったよ」とか教えてもらえると超うれしいですので、その時はご連絡くださいませ。まとめPHPに限らず、プログラミングは構文や関数を覚えることも大事ですが、それ以上に「処理の流れ」を考える力を付けることが大事です。