Ignore:
Timestamp:
2010/02/18 11:06:04 (14 years ago)
Author:
Seasoft
Message:

マスタデータキャッシュに関する改訂

  • キャッシュ生成のロジックをPHP関数に依存させることで高速化。
  • 表示順を任意とすることで一部の処理を高速化。
  • パラメータ更新時の個別ロジックを極力単純にして共通化。
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/comu-ver2/data/class/db/SC_DB_MasterData.php

    r18507 r18571  
    5959     * 
    6060     * 以下の順序でマスタデータを取得する. 
    61      * 1. MASTER_DATA_DIR のマスタデータキャッシュを include() で読み込む 
    62      * 2. 1 で読み込んだ値をチェックし, 値が変数定義されていれば値を返す. 
    63      *    されていなければ, 次の処理を行う. 
    64      * 3. 値が未定義の場合は, DBからマスタデータを取得する. 
    65      * 4. 取得した後, マスタデータのキャッシュを生成し, 値を返す. 
     61     * 1. MASTER_DATA_DIR にマスタデータキャッシュが存在しない場合、 
     62     *    DBからマスタデータを取得して、マスタデータキャッシュを生成する。 
     63     * 2. マスタデータキャッシュを読み込み、変数に格納し返す。 
    6664     * 
    6765     * 返り値は, key => value 形式の配列である. 
     
    7674        $columns = $this->getDefaultColumnName($columns); 
    7775 
    78         // 可変変数を定義 
    79         $valiable = "_" . $name . "_master"; 
     76        $filepath = MASTER_DATA_DIR . $name . '.serial'; 
     77 
     78        if (!file_exists($filepath)) { 
     79            // キャッシュ生成 
     80            $this->createCache($name, $columns); 
     81        } 
     82 
    8083        // キャッシュを読み込み 
    81         @include(MASTER_DATA_DIR . $name . ".php"); 
    82  
    83         // キャッシュがあれば, キャッシュの値を返す. 
    84         if (!empty($$valiable)) { 
    85             return $$valiable; 
    86         } 
    87         // マスタデータを取得 
    88         $masterData = $this->getDbMasterData($name, $columns); 
    89         // キャッシュ生成 
    90         $this->createCache($name, $masterData); 
     84        $masterData = unserialize(file_get_contents($filepath)); 
     85 
    9186        return $masterData; 
    9287    } 
     
    253248     * @return bool キャッシュの生成に成功した場合 true 
    254249     */ 
    255     function createCache($name, $masterData, $isDefine = false, 
     250    function createCache($name, $columns = array(), $isDefine = false, 
    256251                         $commentColumn = array()) { 
    257252 
     253        // マスタデータを取得 
     254        $masterData = $this->getDbMasterData($name, $columns); 
     255 
    258256        // マスタデータを文字列にする 
    259         $data = "<?php\n"; 
    260257        // 定数を生成する場合 
    261258        if ($isDefine) { 
    262  
     259            $path = MASTER_DATA_DIR . $name . '.php'; 
     260 
     261            $data = "<?php\n"; 
    263262            // 定数コメントを生成する場合 
    264263            if (!empty($commentColumn)) { 
     
    268267                $data .= $this->getMasterDataAsDefine($masterData); 
    269268            } 
     269            $data .=  "?>\n"; 
    270270 
    271271        // 配列を生成する場合 
    272272        } else { 
    273             $data .= $this->getMasterDataAsString($name, $masterData); 
    274         } 
    275         $data .=  "?>\n"; 
     273            $path = MASTER_DATA_DIR . $name . '.serial'; 
     274            $data = serialize($masterData); 
     275        } 
    276276 
    277277        // ファイルを書き出しモードで開く 
    278         $path = MASTER_DATA_DIR . $name . ".php"; 
    279278        $handle = fopen($path, "w"); 
    280279        if (!$handle) { 
     
    305304 
    306305        $this->objQuery = new SC_Query(); 
    307         $this->objQuery->setorder($columns[2]); 
     306        if (isset($columns[2]) && strlen($columns[2]) >= 1) { 
     307            $this->objQuery->setorder($columns[2]); 
     308        } 
    308309        $results = $this->objQuery->select($columns[0] . ", " . $columns[1], $name); 
    309310 
     
    337338            return $this->columns; 
    338339        } 
    339     } 
    340  
    341     /** 
    342      * マスタデータの配列を配列定義の文字列として出力する. 
    343      * 
    344      * @access private 
    345      * @param string $name マスタデータ名 
    346      * @param array $masterData マスタデータの配列 
    347      * @return string 配列定義の文字列 
    348      */ 
    349     function getMasterDataAsString($name, $masterData) { 
    350         $data = "\$_" . $name . "_master = array(\n"; 
    351         $i = count($masterData); 
    352         foreach ($masterData as $key => $val) { 
    353             $data .= "'" . $key . "' => '" . $val . "'"; 
    354             if ($i > 1) { 
    355                 $data .= ",\n"; 
    356             } 
    357             $i--; 
    358         } 
    359         $data .= ");\n"; 
    360         return $data; 
    361340    } 
    362341 
Note: See TracChangeset for help on using the changeset viewer.