再構築不要化カスタマイズでキャッシュが消える症状
「再構築不要化カスタマイズ(3.3専用版) - The blog of H.Fujimoto」使っているんですが、以前から不思議に思っていた所がありました。それはキャッシュ (phpcache) ディレクトリ内のファイルが、いきなり消える症状です。今回やっと原因が分かりました。
Movable Type 側の管理テーブル mt_blog の blog_children_modified_on フィールドの時刻と、プラグイン側の最終キャッシュクリア時刻 (dp_last_clear) を比較している所があり、ここで初期化され突然キャッシュがクリアされていました。
そもそも blog_children_modified_on が何の日時を保管しているのかは分からないのですが、この値は頻繁に更新されています。この日時と Apache 側のログの時刻を比較して、やっと突き止めました。時刻自体は mt-comments.cgi が呼ばれたタイミングでぴったり一致。つまりコメントがされ、その次に PerlDynamic.pl が動作した時点でキャッシュが全てクリアされてました。おそらく、mt-tb.cgi とかが動作しても同様かな。
mt/plugins/PerlDynamic/PerlDynamic.pl をこんな風に変更し、突然クリアされることはなくなりました。
--- mt/plugins/PerlDynamic/PerlDynamic.pl.orig Fri Mar 9 21:56:14 2007 +++ mt/plugins/PerlDynamic/PerlDynamic.pl Wed May 16 15:31:43 2007 @@ -164,7 +164,7 @@ return if (!$plugin->get_config_value('dp_use_cache', 'blog:' . $blog->id)); my $last_clear = $plugin->get_config_value('dp_last_clear', 'blog:' . $blog->id); - if ($force || $blog->children_modified_on > $last_clear) { + if ($force) { # clear database eval { my @objs = PerlDynamic::DPCache->load({ blog_id => $blog->id });
もう一つ、mt-dynamic.php の元となるテンプレート。こちらも変更して記事が更新されていたらキャッシュ更新されるように処理を変更。さらにスーパーリロードでその記事だけキャッシュ更新。
--- mt-dynamic.tmpl.orig Wed Mar 7 09:51:47 2007 +++ mt-dynamic.tmpl Thu May 17 00:21:17 2007 @@ -60,7 +60,14 @@ if ($is_use_cache) { // Blogの最終更新日時を取得 - $sql = "select blog_children_modified_on from mt_blog where blog_id = " . $blog_id; + $sql = "select entry_modified_on as blog_children_modified_on "; + $sql .= " from mt_entry, mt_fileinfo "; + $sql .= " where entry_blog_id = fileinfo_blog_id "; + $sql .= " and entry_id = fileinfo_entry_id "; + $sql .= " and entry_blog_id = " . $blog_id; + $sql .= " and fileinfo_url = '" . $base_uri . "'"; + $sql .= " order by entry_modified_on desc "; + $sql .= " limit 1"; $result = @sql_query($con, $sql) or exit(show_error_message("キャッシュの検索に失敗しました sql = $sql")); $data = sql_fetch_array($result); $children_modified_on = $data["blog_children_modified_on"]; @@ -73,7 +80,7 @@ } // ページをキャッシュしないか、ページがキャッシュにないか、Blogの最終更新時刻よりも古いなら、再構築する -if (!$is_use_cache || !$is_exist || $data["dpcache_modified_on"] < $children_modified_on) +if (!$is_use_cache || !$is_exist || $data["dpcache_modified_on"] < $children_modified_on || $_SERVER["HTTP_CACHE_CONTROL"]) { // ページを再構築する $req = "<$MTCGIPath$>plugins/PerlDynamic/mt-perl-dynamic.<$MTGetSystemConfig name="dp_cgi_ext"$>";
ただ、困るのが新規投稿時や、削除時の前後の記事の更新。どうしようかな~。。。