とりあえずキャッシュの有効時間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側で行うようにすれば良いわけですね。
- ad hoc (2)
- Business (24)
- CMS (8)
- Hyper Estraier (4)
- JavaScript (5)
- Life (22)
- Macintosh (4)
- Movable Type (92)
- MTOS (8)
- MT高速化 (20)
- PHP (6)
- Plugins (35)
- SQL (6)
- Tips (12)
- Userbility (7)
- Web Service (6)
- WebSig (5)
- アクセシビリティ (29)
- イベント (12)
- スパム (11)
- モブログ (10)
- 再構築 (22)
- 検索 (7)
<?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は...どうするかな。

カテゴリー: MovableType

