* AutoLinkが有効の時も、recent.dat の処理の高速化を [#hfbec698]

- ページ: [[BugTrack2]]
- 投稿者: 名無しさん
- 優先順位: 低
- 状態: 提案
- カテゴリー: その他
- 投稿日: 2007-09-16 (日) 14:35:45
- バージョン: 

-----
#contents
** メッセージ [#vf6f8249]
[[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 の処理と関係が無い(($pages を共同利用してはいるが、切り離すことは可能である。RecentChanges を書き換える処理の後にAutoLink の処理を実行する必要はありますけど))ので、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 の処理だけ全ファイルを(必ず)開く必要がなくなったとして、どこまで効果があるのかは未知数なんですが((自環境はページ数が少なくて、重すぎる処理がどこまで軽く~というテストにあまり向いてない))、提案しておきます。

***関連 [#pab30e2e]
-[[BugTrack2/151]]


--------
**コメント [#cb86eee7]
- コメントありがとうございます。時間が無いので、全然関係ないかもしれないことを書きます。そういえば更新したページ名がAutoLinkにマッチしている時、何か無駄な処理をキャンセルする余地があるんじゃなかったっけなぁ・・・zzz ((何をどうするべきだ、というのを言葉として具体化しておいていただくと、多分後で助かります)) -- [[henoheno]] &new{2007-09-19 (水) 00:19:03};
-- [[BugTrack2/81]] のような基本ロジックのことは無視して、get_autolink_pattern() を呼び出す時の事を考えると、~
AutoLink のリストを更新する必要があるのは、(1)追加・更新されたページがリストに載っていない時、(2)削除されたページがリストに載っている時、のどちらかが該当している時だけに絞れるのは確かですね。~
今の仕組みだとページ名が「アルファベットのみの構成」と「それ以外」の2種類リストがあるので、上の(1)(2)と合わせると4回はpreg_match() 実行する必要がでてしまいますけど(さらにエラーの可能性も((と書いたら、[[BugTrack2/81]]にでているエラー時処理につながりそうですが、ここはデータの更新時の話なのでちょっとズレてますよね)))。~
後は、$nowikiname やページ名の長さといったget_autolink_pattern() の中で判定していることを、リストを更新しなくてもいいようにとここで除外判定するのかという問題や、put_lastmodified() にも$update と$remove を渡してこの判定処理を入れるのかという問題があります。~
ここまでくると、判定用関数にまとめたほうが良さそうにみえます。[[BugTrack2/196]]と一緒に料理するほうがいいのかな?2つともrecent.dat 更新の呼び出し側ですが、lib/file.php がらみなんで。 --  &new{2007-09-19 (水) 21:17:37};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u8. HTML convert time: 0.062 sec.

OSDN