PHPのフレームワークCodeIgniterで出力画面(ウェブページ)キャッシュを使用する方法とTips。
// 分数で指定します
$this->output->cache( 60*24 ); // 60 * 24 = 1日
標準のビューを使用している場合はこれだけで出力画面のキャッシュが生成されます。 キャッシュの生存時間を過ぎると自動的に消去されます。
テンプレートエンジンを使用している場合は、テンプレートの出力を $html に保存しておき、
$this->output->set_output($html);
$this->output->cache(60*24*3);
でOKです。
config.phpの以下の項目を設定します (設定例)
$config['cache_path'] = FCPATH.'cache_codeigniter/'; // index.php と同じ階層の cache_codeigniter ディレクトリに保存する。
$config['cache_query_string'] = FALSE; // ? 以降のクエリー文字を無視する
ウェブページキャッシュが存在する場合はコントローラーのメソッドを通る前にキャッシュを表示して終了する、のでキャッシュを削除するには別メソッドから行うほうが使い勝手がいいと思われます。
// /foo/bar のキャッシュを削除する
$this->output->delete_cache('/foo/bar');
ログの設定は config.php で以下のパラメータ指定になっています
0 = Disables logging, Error logging TURNED OFF
1 = Error Messages (including PHP errors)
2 = Debug Messages
3 = Informational Messages
4 = All Messages
ここではログスレッショルドに「2」を設定します。
$config['log_threshold'] = 2;
すると、ファイルキャッシュ生成時に `
codeigniter/application/logs/log-XXXXX.php`
に以下のようなログが記録されます
DEBUG - 2016-05-17 20:20:46 --> Cache file written: cache_codeigniter/1821935daa9207253aa5d75940e22e16
確認が終わったらログスレッショルドを戻しておきましょう。
// ページURI, キャッシュID(ファイル名のみ), キャッシュファイル名(フルパス)
list($uri, $cache_id, $cache_path) = $this->_get_cache_path();
private function _get_cache_path(){
$CI =& get_instance();
$path = $CI->config->item('cache_path');
$cache_path = ($path === '') ? APPPATH.'cache/' : $path;
$uri = $CI->config->item('base_url').$CI->config->item('index_page').$CI->uri->uri_string();
if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])){
if (is_array($cache_query_string)){
$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));
}
else{
$uri .= '?'.$_SERVER['QUERY_STRING'];
}
}
$cache_id = md5($uri);
$cache_path .= $cache_id;
return array($uri, $cache_id, $cache_path);
}