[Utility.php] キャッシュファイルを読込む関数

Utility.phpに記述しておきたいfunctionを掲載していきます。
記事中【 C_ 】 で始まるコードは定数です。server_dependence.phpを参照してください。

このエントリでは、【キャッシュファイルを作成する loadCacheFile()関数】を作成します。

キャッシュファイルを作成するには、[Utility.php] キャッシュファイルを作成する関数 をお読み下さい。

さて、前回はキャッシュファイルを作成する関数を作成したので、今回は保存したファイルを読込む関数を作成しようと思います。

前提条件は、キャッシュファイルを作成する関数と同じなので省略します。
説明の都合上、コードを分割して記述いたします。

/*
 * キャッシュファイルを読み込む
 * $fileName : ファイルパス
 * $expire : 有効期限(秒)
 */
function loadCacheFile($fileName, $expire)
{
  // 戻り値の初期化
  $returnData = array(
      "isLoaded" => false  // キャッシュから正常に読込みした
    , "timeStamp" => 0     // キャッシュファイルのタイムスタンプ(秒)
    , "headers" => array() // ヘッダ部分
    , "content" => "");    // 本体部分

【引数について】

  • $fileNameは、読み込むキャッシュファイルのパスです。
  • $expireは、キャッシュを保持する有効期限です。キャッシュファイルのタイムスタンプから $expire 秒経過している場合は、既に存在するキャッシュファイルを無効として扱います。

【戻り値について】
$returnData が、loadCacheFile関数の戻り値になります。配列です。

// 開発時などは C_FILE_CAHCE_ON = false でキャッシュを無効化
  if ( ! C_FILE_CAHCE_ON){  return $returnData;

開発時にキャッシュが効いてしまうとプログラム変更が反映されずに面倒だと思います。
define("C_FILE_CAHCE_ON", false);
などと、別途定数宣言しておき、C_FILE_CAHCE_ON が false ならキャッシュ読み出しを無効化することにします。

//	キャッシュのチェック
  if (file_exists($fileName)){  //  キャッシュファイルが存在する
    $t = filemtime($fileName);
    if ($t > (time() - $expire)){  //  タイムスタンプが有効期限以内なら
      $returnData["timeStamp"] = $t;  //	ファイルのタイムスタンプをセット
      $fp = fopen($fileName, 'r');
      if ($fp){
        $readMode = 0;
        while ( ! feof($fp)) {
          $line = fgets($fp);
          if ($line == "---------- header ----------n"){
            $readMode = 1;
          } else if ($line == "---------- content ----------n"){
            $readMode = 2;
          } else if ($readMode == 1){ // header を読込む
            $buf = explode("t", str_replace("n", "", $line));
            $returnData["headers"][ $buf[0] ] = $buf[1];
          } else if ($readMode == 2){ // content を読込む
            $returnData["content"] .= $line;
          }
        }
        fclose($fp);
        if ($readMode > 0) $returnData["isLoaded"] = true;
      }
    }
  }
  return $returnData;
}

一気に書きましたが、次のような流れです。

  1. キャッシュファイルが存在するか確認
  2. キャッシュファイルのタイムスタンプを取得
  3. タイムスタンプが有効期限内か確認
  4. キャッシュファイルをオープンする
  5. ヘッダー部を読み出す
  6. 本体部を読み出す
  7. キャッシュファイルを閉じる

ここまでが全て正常に行われた場合、キャッシュファイルからの読み出し成功フラグを true にします。呼び出し側では、まず最初に、$returnData["isLoaded"] が true かどうかを確認して、成功したかどうかを確認します。

43行目の } は、function を閉じる括弧です。

次回は、 キャッシュファイルの、書込みと読込みのサンプルを掲載しようと思います。