PHPプログラムに関する各種メモ書き

フレームワークCodeIgniterで出力画面のファイルキャッシュを使用する

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');

● ウェブページキャッシュファイル名を確認する

1. ログファイルでキャッシュファイル名を確認する。(config.php でキャッシュ生成時のログを出力するように設定し確認する)

ログの設定は 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

確認が終わったらログスレッショルドを戻しておきましょう。

2. キャッシュファイル名を確認するメソッドでコントローラー内でログファイル名を確認する

● ウェブページキャッシュファイル名を取得するメソッド _get_cache_path()

// ページ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);
}

関連エントリー

No.1034
08/08 13:47

edit

CodeIgniter