BugTrack/2151
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* put_lastmodified() の負荷軽減(案) [#f6415ec4]
- ページ: [[BugTrack2]]
- 投稿者: [[0]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: その他
- 投稿日: 2006-01-15 (日) 04:37:34
- バージョン:
#contents
** 修正 [#t0c37908]
(PukiWiki 1.4.7)
- [[cvs:lib/file.php]] (r1.52 - r1.67)
+ 関数 lastmodified_add() を新規に作成しました。
-- この関数は、file_write() でput_lastmodified() の代わり...
従来: file_write() => put_lastmodified()
今後: file_write() => lastmodified_add() [必要なら => pu...
-- put_lastmodified() はディレクトリを走査するため、ペー...
-- lastmodified_add()は、可能であれば put_lastmodified() ...
-- put_lastmodified() がコールされる条件は以下の通りです:
--- RecentChanges のキャッシュファイル recent.dat が存在...
--- あらかじめ大目に recent.dat に記録しておいた件数(デフ...
--- AutoLinkが有効である時 (常にディレクトリ走査を要求し...
+ put_lastmodified() が情報を格納するキャッシュファイル r...
-- 従来は常に全ページのページ名とその時刻を保存していたた...
** 関連 [#q4d22062]
- [[BugTrack2/150]]: recentプラグインでrecent.datを有効活...
- [[BugTrack/448]]: flockが有効に使われていない
** メッセージ [#e1e93e77]
~ official の WebTrack/59(←削除予定) から移動してき...
~ ページ更新時の負荷の大部分が put_lastmodified() による...
~ official ではページ数が 2450 ページ弱(( 2006年01月現在 ...
~ ページ数が 1000 単位になった場合、処理時間は大きく変わ...
~ 以下に案として挙げておきます。
diff -ur /org/file.php /dev/file.php
--- /org/file.php
+++ /dev/file.php
@@ -259,20 +259,68 @@
// Update RecentChanges
function put_lastmodified()
{
- global $maxshow, $whatsnew, $non_list, $autolink;
+ global $maxshow, $whatsnew, $non_list, $autolink, $vars;
if (PKWK_READONLY) return; // Do nothing
- $pages = get_existpages();
+ $term = 60 * 60;// 1時間以上経過していれば作り直す
+
+ $recentFile = CACHE_DIR . 'recent.dat';
+ $recentTimefile = $recentFile . 'time';
+
+ $timeFlag = (file_exists($recentTimefile) && time() ...
+ $RecentFlag = (file_exists($recentFile) && $timeFlag);
+
$recent_pages = array();
$non_list_pattern = '/' . $non_list . '/';
- foreach($pages as $page)
- if ($page != $whatsnew && ! preg_match($non_list_patt...
- $recent_pages[$page] = get_filetime($page);
+ if ($RecentFlag) {// recent.dat を使用する.
+ $varsPage = (isset($vars['page'])) ? $vars['page'] : ...
+
+ $fp = @fopen($recentFile, 'r');
+
+ // 不整合を防ぐため (排他的ロック && ノーブロック)
+ $wouldblock = true;
+ if ($fp && flock($fp, LOCK_EX + LOCK_NB, $wouldblock)...
+ $lines = file($recentFile);
+ $lines = str_replace("\n", '', $lines);
+ foreach ($lines as $line) {
+ if (empty($line)) {
+ break;// ないはず.
+ }
+ list($getTime, $getPage) = explode("\t", $line);
+ if ($getPage != $whatsnew && ! preg_match($non_list...
+ $recent_pages[$getPage] = $getTime;
+ }
+ }
+ if (is_page($varsPage) && ! preg_match($non_list_pat...
+ $recent_pages[$varsPage] = get_filetime($varsPage);
+ } elseif (isset($recent_pages[$varsPage])) {
+ unset($recent_pages[$varsPage]);
+ }
+ } else {
+ $RecentFlag = false;
+ }
+ }
+
+ // 通常の処理 (排他的ロック中に遭遇した場合も諦めてこ...
+ // ロックで弾かれた場合、処理が追いつくことはないはず・・・
+ if (! $RecentFlag) {
+ $pages = get_existpages();
+ foreach($pages as $page) {
+ if ($page != $whatsnew && ! preg_match($non_list_pat...
+ $recent_pages[$page] = get_filetime($page);
+ }
+ }
+ @fopen($recentTimefile, 'w');// ファイルを作るだけ
+ }
// Sort decending order of last-modification date
arsort($recent_pages, SORT_NUMERIC);
+ if (isset($fp)) {
+ flock($fp, LOCK_UN);
+ }
+
// Create recent.dat (for recent.inc.php)
$fp = fopen(CACHE_DIR . 'recent.dat', 'w') or
die_message('Cannot write cache file ' .
~ ブラウザ複数窓, sleep() などで実験はしましたが、実用に...
--------
***コメント [#ha7f010b]
- 確かにお試しは軽いですねー。うちのサイト(約2000ページ&...
- 関連 [[dev:BugTrack/763]] 負荷対策のまとめ -- [[teanan]...
-- BugTrack に移動させた方が良いですかねぇ・・・? (^^; -- [[...
-- パフォーマンス改善ネタとしてBugTrackにあげて頂いたほう...
~ ここまでが WebTrack/59 でのコメントです。
----
- 実は recent.dat を get_filetimeのキャッシュにしてみよう...
- [[0]]さんの提案は毎度良い所突いてて素敵です。 気分的に...
-- う・・・普通に edit しか試していませんでした。確かに pcom...
- put_lastmodified() に ページ名を与える。
function file_write()
{
(-- 略 --)
- put_lastmodified()
+ put_lastmodified($page)
(-- 略 --)
}
-function put_lastmodified()
+function put_lastmodified($editPage)
{
$varsPage を $editPage に置き換える
}
plugin/pcomment.inc.php
function plugin_pcomment_insert()
{
(-- 略 --)
- put_lastmodified();
+ put_lastmodified($refer);
(-- 略 --)
}
- put_lastmodified() が呼び出されているのは現状二箇所だけ...
- ツボの突き具合について同感です -- [[henoheno]] &new{200...
- 素晴らしい・・・最高のhackだとは思わんかね?見ろ!今ま...
- PukiWiki-Officialへの導入はまだですか? -- &new{2006-0...
-- Officialへ導入するなら、先にCVSに入れて冒険者達に人柱...
- ムスカさんまで現れましたね。とりあえず一点問題がありま...
- flockが競合した場合に重い処理に入るフローになっているの...
- 運用に関する話になりますが、official/devは安定して稼動...
- CVS版にはもう入っているんですか? -- &new{2006-01-26 (...
- まだだと思う。 -- &new{2006-01-26 (木) 19:31:43};
- 処理に recent.dat を使うという提案とサンプルコードなの...
-- とりあえず処理の方向性を決めて具体化(コード化( -> 差分...
--- ファイルの扱いは fopen(r+) -> LOCK_EX -> file(recent....
--- ファイルがない場合は現状の処理で。 -- [[0]] &new{2006...
--- ファイルの扱いに問題がなければ $term で処理している部...
- ツッコミあればよろしくお願いします :) -- [[0]] &new{200...
- 人柱モードで私のサイトに導入しました(PukiWiki 1.4.6 + P...
//#comment
------------------
** recent.datの内部構造、想定している本来の利用方法につい...
- 各種コメントありがとうございます。本日見たところでは「r...
-- (1) recent.datの内部構造は参照側(recentやrss)に特化さ...
-- (2) get_filetime()の結果をページ数分抱える意義が本当に...
-- (3) 1を踏まえて考えるに、recent.dat は必要最小限の行数...
-- (4) 3を踏まえて考えるに、新たにページが更新された時に...
-- (5) 4の状態まで来ると、RecentChangesを更新するのに全ペ...
-- (6) これはデータ構造と、そのためのアルゴリズムの話であ...
- [[cvs:lib/file.php]] (1.51): BugTrack2/151: Cut unused ...
-- 上記(3)を実装しました。$maxshow で設定している (Recent...
- 上記(4)~(6)は、recent.datを新規に構築する (5) を発生さ...
-- 仮に時間としましょう。6時間経ったら更新させるとして・...
-- recent.dat が存在しない場合%%や、その項目数が設定と異...
- (3)について。[[BugTrack2/45]]のrecentの1機能、特定ペー...
-- いつもありがとうございます。「現状の仕様において、rece...
-- で、「特定の文字列でフィルタする」とか「特定の期間で考...
-- 件数ベースでストアしている情報を強引にフィルタする場合...
-- このへんは設計(デザイン)の話でしょうね :) -- [[henohen...
- 件数ベースで記録している現状は、$maxshow で指定された件...
-- 例えば 10件 余分に recent.dat に記録する様にしたサイト...
- 更新時の処理のみ無理やり実装。ページ削除に対するケアも...
-- [[cvs:lib/file.php]] (1.52 - 1.60)
- 質問箱を見るに、コンテンツの引越などの理由でwiki/*.txt...
-- 今この瞬間の[[CVS版]]の実装で答えるならば、ページを適...
-- その他、recent.datを削除することで、再作成を強制するこ...
- 削除のアクションは、RecentDeletedなどの挙動もフォローし...
-- 削除時の処理で、lastmodified_add() に RecentDeleted の...
-- OK。[[cvs:lib/file.php]] (r1.67) -- [[henoheno]] &new{...
-- これで、ページの削除に関しても、あらかじめ多めに取って...
- 特にないなら、この見出し部分の話題は終了です。(あれば)...
-- ([[BugTrack2/179]]) put_lastmodified() に行った修正に...
- 関連: [[BugTrack2/196]], [[BugTrack2/273]] -- &new{200...
--------------
** コメント: バッファ操作? [#bdd30207]
- ([[BugTrack2/166]] に移動しました)
----
**コメント [#ec014ecd]
- [[BugTrack2/341]] -- &new{2010-11-24 (水) 14:14:57};
-- 5000件程度のデータ挿入をすると直っていないのがわか...
- それだけ1度で変更するなら、lastmodified_add()を5000回じ...
- 挿入後 データを編集して、保存すればわかる。やりもしな...
- [[BugTrack2/56]], [[BugTrack2/80]] -- &new{2010-11-25 ...
#comment
終了行:
* put_lastmodified() の負荷軽減(案) [#f6415ec4]
- ページ: [[BugTrack2]]
- 投稿者: [[0]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: その他
- 投稿日: 2006-01-15 (日) 04:37:34
- バージョン:
#contents
** 修正 [#t0c37908]
(PukiWiki 1.4.7)
- [[cvs:lib/file.php]] (r1.52 - r1.67)
+ 関数 lastmodified_add() を新規に作成しました。
-- この関数は、file_write() でput_lastmodified() の代わり...
従来: file_write() => put_lastmodified()
今後: file_write() => lastmodified_add() [必要なら => pu...
-- put_lastmodified() はディレクトリを走査するため、ペー...
-- lastmodified_add()は、可能であれば put_lastmodified() ...
-- put_lastmodified() がコールされる条件は以下の通りです:
--- RecentChanges のキャッシュファイル recent.dat が存在...
--- あらかじめ大目に recent.dat に記録しておいた件数(デフ...
--- AutoLinkが有効である時 (常にディレクトリ走査を要求し...
+ put_lastmodified() が情報を格納するキャッシュファイル r...
-- 従来は常に全ページのページ名とその時刻を保存していたた...
** 関連 [#q4d22062]
- [[BugTrack2/150]]: recentプラグインでrecent.datを有効活...
- [[BugTrack/448]]: flockが有効に使われていない
** メッセージ [#e1e93e77]
~ official の WebTrack/59(←削除予定) から移動してき...
~ ページ更新時の負荷の大部分が put_lastmodified() による...
~ official ではページ数が 2450 ページ弱(( 2006年01月現在 ...
~ ページ数が 1000 単位になった場合、処理時間は大きく変わ...
~ 以下に案として挙げておきます。
diff -ur /org/file.php /dev/file.php
--- /org/file.php
+++ /dev/file.php
@@ -259,20 +259,68 @@
// Update RecentChanges
function put_lastmodified()
{
- global $maxshow, $whatsnew, $non_list, $autolink;
+ global $maxshow, $whatsnew, $non_list, $autolink, $vars;
if (PKWK_READONLY) return; // Do nothing
- $pages = get_existpages();
+ $term = 60 * 60;// 1時間以上経過していれば作り直す
+
+ $recentFile = CACHE_DIR . 'recent.dat';
+ $recentTimefile = $recentFile . 'time';
+
+ $timeFlag = (file_exists($recentTimefile) && time() ...
+ $RecentFlag = (file_exists($recentFile) && $timeFlag);
+
$recent_pages = array();
$non_list_pattern = '/' . $non_list . '/';
- foreach($pages as $page)
- if ($page != $whatsnew && ! preg_match($non_list_patt...
- $recent_pages[$page] = get_filetime($page);
+ if ($RecentFlag) {// recent.dat を使用する.
+ $varsPage = (isset($vars['page'])) ? $vars['page'] : ...
+
+ $fp = @fopen($recentFile, 'r');
+
+ // 不整合を防ぐため (排他的ロック && ノーブロック)
+ $wouldblock = true;
+ if ($fp && flock($fp, LOCK_EX + LOCK_NB, $wouldblock)...
+ $lines = file($recentFile);
+ $lines = str_replace("\n", '', $lines);
+ foreach ($lines as $line) {
+ if (empty($line)) {
+ break;// ないはず.
+ }
+ list($getTime, $getPage) = explode("\t", $line);
+ if ($getPage != $whatsnew && ! preg_match($non_list...
+ $recent_pages[$getPage] = $getTime;
+ }
+ }
+ if (is_page($varsPage) && ! preg_match($non_list_pat...
+ $recent_pages[$varsPage] = get_filetime($varsPage);
+ } elseif (isset($recent_pages[$varsPage])) {
+ unset($recent_pages[$varsPage]);
+ }
+ } else {
+ $RecentFlag = false;
+ }
+ }
+
+ // 通常の処理 (排他的ロック中に遭遇した場合も諦めてこ...
+ // ロックで弾かれた場合、処理が追いつくことはないはず・・・
+ if (! $RecentFlag) {
+ $pages = get_existpages();
+ foreach($pages as $page) {
+ if ($page != $whatsnew && ! preg_match($non_list_pat...
+ $recent_pages[$page] = get_filetime($page);
+ }
+ }
+ @fopen($recentTimefile, 'w');// ファイルを作るだけ
+ }
// Sort decending order of last-modification date
arsort($recent_pages, SORT_NUMERIC);
+ if (isset($fp)) {
+ flock($fp, LOCK_UN);
+ }
+
// Create recent.dat (for recent.inc.php)
$fp = fopen(CACHE_DIR . 'recent.dat', 'w') or
die_message('Cannot write cache file ' .
~ ブラウザ複数窓, sleep() などで実験はしましたが、実用に...
--------
***コメント [#ha7f010b]
- 確かにお試しは軽いですねー。うちのサイト(約2000ページ&...
- 関連 [[dev:BugTrack/763]] 負荷対策のまとめ -- [[teanan]...
-- BugTrack に移動させた方が良いですかねぇ・・・? (^^; -- [[...
-- パフォーマンス改善ネタとしてBugTrackにあげて頂いたほう...
~ ここまでが WebTrack/59 でのコメントです。
----
- 実は recent.dat を get_filetimeのキャッシュにしてみよう...
- [[0]]さんの提案は毎度良い所突いてて素敵です。 気分的に...
-- う・・・普通に edit しか試していませんでした。確かに pcom...
- put_lastmodified() に ページ名を与える。
function file_write()
{
(-- 略 --)
- put_lastmodified()
+ put_lastmodified($page)
(-- 略 --)
}
-function put_lastmodified()
+function put_lastmodified($editPage)
{
$varsPage を $editPage に置き換える
}
plugin/pcomment.inc.php
function plugin_pcomment_insert()
{
(-- 略 --)
- put_lastmodified();
+ put_lastmodified($refer);
(-- 略 --)
}
- put_lastmodified() が呼び出されているのは現状二箇所だけ...
- ツボの突き具合について同感です -- [[henoheno]] &new{200...
- 素晴らしい・・・最高のhackだとは思わんかね?見ろ!今ま...
- PukiWiki-Officialへの導入はまだですか? -- &new{2006-0...
-- Officialへ導入するなら、先にCVSに入れて冒険者達に人柱...
- ムスカさんまで現れましたね。とりあえず一点問題がありま...
- flockが競合した場合に重い処理に入るフローになっているの...
- 運用に関する話になりますが、official/devは安定して稼動...
- CVS版にはもう入っているんですか? -- &new{2006-01-26 (...
- まだだと思う。 -- &new{2006-01-26 (木) 19:31:43};
- 処理に recent.dat を使うという提案とサンプルコードなの...
-- とりあえず処理の方向性を決めて具体化(コード化( -> 差分...
--- ファイルの扱いは fopen(r+) -> LOCK_EX -> file(recent....
--- ファイルがない場合は現状の処理で。 -- [[0]] &new{2006...
--- ファイルの扱いに問題がなければ $term で処理している部...
- ツッコミあればよろしくお願いします :) -- [[0]] &new{200...
- 人柱モードで私のサイトに導入しました(PukiWiki 1.4.6 + P...
//#comment
------------------
** recent.datの内部構造、想定している本来の利用方法につい...
- 各種コメントありがとうございます。本日見たところでは「r...
-- (1) recent.datの内部構造は参照側(recentやrss)に特化さ...
-- (2) get_filetime()の結果をページ数分抱える意義が本当に...
-- (3) 1を踏まえて考えるに、recent.dat は必要最小限の行数...
-- (4) 3を踏まえて考えるに、新たにページが更新された時に...
-- (5) 4の状態まで来ると、RecentChangesを更新するのに全ペ...
-- (6) これはデータ構造と、そのためのアルゴリズムの話であ...
- [[cvs:lib/file.php]] (1.51): BugTrack2/151: Cut unused ...
-- 上記(3)を実装しました。$maxshow で設定している (Recent...
- 上記(4)~(6)は、recent.datを新規に構築する (5) を発生さ...
-- 仮に時間としましょう。6時間経ったら更新させるとして・...
-- recent.dat が存在しない場合%%や、その項目数が設定と異...
- (3)について。[[BugTrack2/45]]のrecentの1機能、特定ペー...
-- いつもありがとうございます。「現状の仕様において、rece...
-- で、「特定の文字列でフィルタする」とか「特定の期間で考...
-- 件数ベースでストアしている情報を強引にフィルタする場合...
-- このへんは設計(デザイン)の話でしょうね :) -- [[henohen...
- 件数ベースで記録している現状は、$maxshow で指定された件...
-- 例えば 10件 余分に recent.dat に記録する様にしたサイト...
- 更新時の処理のみ無理やり実装。ページ削除に対するケアも...
-- [[cvs:lib/file.php]] (1.52 - 1.60)
- 質問箱を見るに、コンテンツの引越などの理由でwiki/*.txt...
-- 今この瞬間の[[CVS版]]の実装で答えるならば、ページを適...
-- その他、recent.datを削除することで、再作成を強制するこ...
- 削除のアクションは、RecentDeletedなどの挙動もフォローし...
-- 削除時の処理で、lastmodified_add() に RecentDeleted の...
-- OK。[[cvs:lib/file.php]] (r1.67) -- [[henoheno]] &new{...
-- これで、ページの削除に関しても、あらかじめ多めに取って...
- 特にないなら、この見出し部分の話題は終了です。(あれば)...
-- ([[BugTrack2/179]]) put_lastmodified() に行った修正に...
- 関連: [[BugTrack2/196]], [[BugTrack2/273]] -- &new{200...
--------------
** コメント: バッファ操作? [#bdd30207]
- ([[BugTrack2/166]] に移動しました)
----
**コメント [#ec014ecd]
- [[BugTrack2/341]] -- &new{2010-11-24 (水) 14:14:57};
-- 5000件程度のデータ挿入をすると直っていないのがわか...
- それだけ1度で変更するなら、lastmodified_add()を5000回じ...
- 挿入後 データを編集して、保存すればわかる。やりもしな...
- [[BugTrack2/56]], [[BugTrack2/80]] -- &new{2010-11-25 ...
#comment
ページ名: