アルファサード株式会社 代表取締役 野田 純生のブログ


タグ検索 / 検索結果フィードのキャッシュの実装。


公開日 : 2007-10-23 14:26:04


とりあえずキャッシュの有効時間1時間ということで実装してみた。mt.php の view を上書きしてSmartyのキャッシュを使おうかとも考えたけど、mtview.php に直接書いた方が早そうだったので。

MT3では Dynamic Site Bootstrapper っていう名前のインデックス・テンプレートがあったけど、MT4ではテンプレートではない。キャッシュのオンオフは管理画面からチェックボックスひとつで行えるようになってる。なのでMT4の場合は Dynamic Site Bootstrapper テンプレートを改めて作成してから以下のような感じで(出力ファイル名はmtview.php)。

ob_start, ob_get_contents ってのがあるのね。知らんかった。ってか、PHPって本当何でも関数になってる。好きな人多いの分かるわ、いや本当。

あとはキャッシュクリアのタイミングをPerl側プラグインで書いてCMS側で行うようにすれば良いわけですね。


<?php
    $server_cache = 3600; //キャッシュの有効時間(秒)
    $cache_dir = '/path/to/cache/'; //キャッシュの保存場所
    include('<$MTCGIServerPath$>/php/mt.php');
    $mt = new MT(<$MTBlogID$>, '<$MTConfigFile$>');
    $pattern = '/(search¥.html|feed¥.xml)/';
    if (preg_match($pattern, $_SERVER['REQUEST_URI'])) {
        //キャシュ条件を細かく指定する場合はこの辺であれこれと...
        //この状態だとキーワード検索だろうが何だろうがキャッシュする
        $search = true;
        //check own cache
        $path = getenv('REQUEST_URI');
        $path = str_replace('/', '%2F', $path); //
        $path = str_replace('..', '', $path); // ../とか含めない
        $cache = $cache_dir . $path;
        if (file_exists($cache)) {
            $mtime = filemtime($cache);
            if ((time() - $mtime) > $server_cache) {
                //unlink($cache);
                $match = 0;
            } else {
                $match = 1;
            }
        } else {
            $match = 0;
        }
        if ($match) {
            if (!($fcache = fopen($cache, 'r'))) {
                $match = 0;
            } else {
                $rec = file($cache);
                foreach ($rec as $line) {
                    echo "$line¥n";
                }
                return;
            }
        }
    } else {
        $mt->caching = true;
    }
    $mt->conditional = true;
    ob_start();
        $mt->view();
        $output = ob_get_contents();
    ob_end_clean();
    echo $output;
    if ($search) {
        //save own cache
        if (!($match)) {
            if (!($fh = fopen($cache, 'w'))) {
                return;
            }
            fwrite($fh, $output, 128000);
            fclose($fh);
        }
    }
?>

追記:

MT4ではメニューにしてみた。MT3は...どうするかな。

プルダウンメニューからキャッシュのクリアが出来る

あと、mtview.phpを少し修正。

カテゴリ


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ

ページにルビを振る