AutoLinkが有効の時も、recent.dat の処理の高速化を


メッセージ

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、提案しておきます。

関連


コメント



*1 $pages を共同利用してはいるが、切り離すことは可能である。RecentChanges を書き換える処理の後にAutoLink の処理を実行する必要はありますけど
*2 自環境はページ数が少なくて、重すぎる処理がどこまで軽く~というテストにあまり向いてない
*3 何をどうするべきだ、というのを言葉として具体化しておいていただくと、多分後で助かります
*4 と書いたら、BugTrack2/81にでているエラー時処理につながりそうですが、ここはデータの更新時の話なのでちょっとズレてますよね

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-08 (月) 13:09:13
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.261 sec.

SourceForge