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

| コメント(0) | トラックバック(0)

とりあえずキャッシュの有効時間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を少し修正。

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/154

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2007年10月23日 14:26に書いたブログ記事です。

ひとつ前のブログ記事は「(続)MT4で画像挿入の際にclassやstyleが付くのが嫌! なあなたに。」です。

次のブログ記事は「HTTPレスポンスヘッダとかステータスコードとかキャッシュとか。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6