BugTrack2/196#q089d030 のために、BugTrack2/151やlib/file.php を覗いていたのですが、put_lastmodified() で実行しているAutoLink の処理は実質この部分だけみたいです。
$pages = get_existpages(); (ここの間に、recent.dat を再生成する処理と、それを基にRecentChanges を更新する処理が入る) if ($autolink){ autolink_pattern_write(CACHE_DIR . PKWK_AUTOLINK_REGEX_CACHE, get_autolink_pattern($pages, $autolink)); }
つまり、recent.dat を作り直す部分はAutoLink の処理と関係が無い*1ので、lastmodified_add() をこんな感じに変えてはどうでしょうか。
cvs:lib/file.php (1.86) をベースに
function lastmodified_add($update = '', $remove = '') { global $maxshow, $whatsnew, $autolink; - // AutoLink implimentation needs everything, for now - if ($autolink) { - put_lastmodified(); // Try to (re)create ALL - return; - } + if (PKWK_READONLY) return; // Do nothing - if (($update == '' || check_non_list($update)) && $remove == '') - return; // No need + if (($update == '' || check_non_list($update)) && $remove == '') { + if ($autolink) { + $pages = get_existpages(); + autolink_pattern_write(CACHE_DIR . PKWK_AUTOLINK_REGEX_CACHE, + get_autolink_pattern($pages, $autolink)); + } + return; + } (中略) // Recreate ftruncate($fp, 0); rewind($fp); foreach ($recent_pages as $_page=>$time) fputs($fp, '-' . htmlspecialchars(format_date($time)) . ' - ' . '[[' . htmlspecialchars($_page) . ']]' . "\n"); fputs($fp, '#norelated' . "\n"); // :) flock($fp, LOCK_UN); fclose($fp); + + if ($autolink) { + $pages = get_existpages(); + autolink_pattern_write(CACHE_DIR . PKWK_AUTOLINK_REGEX_CACHE, + get_autolink_pattern($pages, $autolink)); + } }
if (PKWK_READONLY) が追加されているのは、put_lastmodified() にはこれがあるのに、何でlastmodified_add() には無いんだろう、という理由だけです。
本当は、if ($autolink) の中の処理を関数化した方がいいかなとも思うのですが、いい関数名が思いつかないのでこのままです(autolink_pattern_write() はAutoLinkだけでなく、AutoAliasのためにも使ってますから)。
recent.dat の処理だけ全ファイルを(必ず)開く必要がなくなったとして、どこまで効果があるのかは未知数なんですが*2、提案しておきます。