BugTrack/2401
の編集
Top
/
BugTrack
/
2401
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
RIGHT:&size(12){Category:[[:Plugin]]}; * bugtrack_listの高速化 [#x0511251] - ページ: [[BugTrack2]] - 投稿者: [[umorigu]] - 優先順位: 普通 - 状態: 完了 - カテゴリー: プラグイン - 投稿日: 2016-11-30 (水) 00:54:25 - バージョン: 1.5.1 - リリース予定バージョン: 1.5.2 ** メッセージ [#b8383f90] bugtrack_listは、表示時に列挙対象の全ページを読み込むのでサーバー負荷が高く、また表示に時間がかかっている。 表示項目を適切にキャッシュすることで、表示の高速化とサーバー負荷軽減を実現したい。 仕様: - PHP5.4以降でキャッシュが有効 (5.4未満ではキャッシュされない。bugtrack_list自体は動作する) - 更新日時が変わらないページのデータがキャッシュされる - キャッシュの有効期限は最大24時間。生成から24時間経った後の最初のリクエストで、キャッシュデータが再作成される -- この仕様のため、リスト生成が1リクエスト中に完了しない量のデータでは動作しない (従来通り) -------- - tracker_listの高速化のチケットはありましたが、bugtrack_list単体のものはなかったので立てました。tracker_listとbutrack_listの仕組みは似ているため、tracker_listの高速化のヒントになると思います。また、bugtrack_listの方がシンプルで高速化の対応も容易だと踏んでいます -- [[umorigu]] &new{2016-11-30 (水) 00:57:22}; - しかしbagtrack_listをヘビーに使っているのは世界中でこのサイト(pukiwiki-dev)だけかもしれません :-) -- [[umorigu]] &new{2016-11-30 (水) 00:58:13}; - 更新時刻ベースのキャッシュを試作してみました。 pukiwiki.osdn.jp/_dev3/?BugTrack キャッシュなしでは4-7秒のところ、キャッシュを実装して1秒台で表示できるようになっています -- [[umorigu]] &new{2016-11-30 (水) 03:08:49}; - 👍 -- [[bee]] &new{2016-12-01 (木) 12:19:20}; -- (主題と全く関係ないのですが)Android 版 Firefox で絵文字が見えない…。 -- [[bee]] &new{2016-12-01 (木) 12:54:42}; - 前準備(?)の[[commit:3e7e44d6e4c39c334fc86d68cff0b2d1fb38c560]]で、少し疑問があります。呼び出している関数の定義側 function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE, $filetime = NULL) で、move to NewPageName のリダイレクト先を読み込んでリストに反映するかを制御している3つ目の引数はTRUE or FALSEフラグ前提で設計されていたような気がするので、本来の意味合いでは $data[] = plugin_bugtrack_list_pageinfo($page['name'], NULL, FALSE, $page['filetime']); の呼び出し方のほうが正しいのではないかと… -- &new{2016-12-01 (木) 21:12:18}; -- ありがとうございます。ご指摘の通りでした -- [[umorigu]] &new{2016-12-01 (木) 23:22:24}; - 対応しました [[commit:5127a22a15]] -- [[umorigu]] &new{2016-12-02 (金) 08:25:49}; - file_get_contents/file_put_contents が flock されてない気がしますね…。 --- a/plugin/bugtrack.inc.php +++ b/plugin/bugtrack.inc.php @@ -299,7 +299,7 @@ function plugin_bugtrack_list_convert() // Cache management $data_updated = true; $cache_filepath = CACHE_DIR . encode($page) . '.bugtrack'; - $json_cached = file_get_contents($cache_filepath); + $json_cached = _pkwk_file_get_contents($cache_filepath); if ($json_cached) { $wrapdata = json_decode($json_cached); if (is_object($wrapdata)) { @@ -386,7 +386,7 @@ EOD; } $json = array('refreshed_at'=>$refreshed_at, 'pages'=>$data, 'version'=>$cache_format_version); $cache_body = json_encode($json, JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES); - file_put_contents($cache_filepath, $cache_body); + file_put_contents($cache_filepath, $cache_body, LOCK_EX); } } $table = array(); @@ -447,3 +447,14 @@ function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE, $file return array($page, $no, $summary, $name, $priority, $state, $category, $filetime); } + +function _pkwk_file_get_contents($filename) { + if (! file_exists($filename)) { + return false; + } + $fp = fopen($filename, 'rb'); + flock($fp, LOCK_SH); + $file = file_get_contents($filename); + flock($fp, LOCK_UN); + return $file; +} こんな感じかな。 -- [[bee]] &new{2016-12-03 (土) 00:30:54}; --- PHP 5.2.5 以前の file_put_contents() にはバグがあるのですが、今回は PHP 5.4 以降のみなので問題ないでしょう。 kannokanno.hatenablog.com/entry/20120624/1340532542 (("php-5.2.5以前のfile_put_contentsではLOCK_EXによる排他ロックは動かない(5.2.6でFix)")) -- [[bee]] &new{2016-12-03 (土) 00:34:08}; -- こんな罠があったとは。採用させていただきます。m(__)m -- [[umorigu]] &new{2016-12-03 (土) 05:50:29}; -- 対応しました [[commit:ef13260aa6]] -- [[umorigu]] &new{2016-12-03 (土) 06:33:16}; - 読み込み権限のないBugTrack listを表示できないようにしました [[commit:574cf886af]] -- [[umorigu]] &new{2017-02-18 (土) 02:04:48}; - [[BugTrack/560]]のキャッシュ判定(recent.datとRecentDeletedが変わっていない場合、変換済みHTMLをそのまま出力)も取り入れて、さらに速度改善しました commit:51239db40c -- [[umorigu]] &new{2018-03-15 (木) 00:56:21}; #comment
タイムスタンプを変更しない
RIGHT:&size(12){Category:[[:Plugin]]}; * bugtrack_listの高速化 [#x0511251] - ページ: [[BugTrack2]] - 投稿者: [[umorigu]] - 優先順位: 普通 - 状態: 完了 - カテゴリー: プラグイン - 投稿日: 2016-11-30 (水) 00:54:25 - バージョン: 1.5.1 - リリース予定バージョン: 1.5.2 ** メッセージ [#b8383f90] bugtrack_listは、表示時に列挙対象の全ページを読み込むのでサーバー負荷が高く、また表示に時間がかかっている。 表示項目を適切にキャッシュすることで、表示の高速化とサーバー負荷軽減を実現したい。 仕様: - PHP5.4以降でキャッシュが有効 (5.4未満ではキャッシュされない。bugtrack_list自体は動作する) - 更新日時が変わらないページのデータがキャッシュされる - キャッシュの有効期限は最大24時間。生成から24時間経った後の最初のリクエストで、キャッシュデータが再作成される -- この仕様のため、リスト生成が1リクエスト中に完了しない量のデータでは動作しない (従来通り) -------- - tracker_listの高速化のチケットはありましたが、bugtrack_list単体のものはなかったので立てました。tracker_listとbutrack_listの仕組みは似ているため、tracker_listの高速化のヒントになると思います。また、bugtrack_listの方がシンプルで高速化の対応も容易だと踏んでいます -- [[umorigu]] &new{2016-11-30 (水) 00:57:22}; - しかしbagtrack_listをヘビーに使っているのは世界中でこのサイト(pukiwiki-dev)だけかもしれません :-) -- [[umorigu]] &new{2016-11-30 (水) 00:58:13}; - 更新時刻ベースのキャッシュを試作してみました。 pukiwiki.osdn.jp/_dev3/?BugTrack キャッシュなしでは4-7秒のところ、キャッシュを実装して1秒台で表示できるようになっています -- [[umorigu]] &new{2016-11-30 (水) 03:08:49}; - 👍 -- [[bee]] &new{2016-12-01 (木) 12:19:20}; -- (主題と全く関係ないのですが)Android 版 Firefox で絵文字が見えない…。 -- [[bee]] &new{2016-12-01 (木) 12:54:42}; - 前準備(?)の[[commit:3e7e44d6e4c39c334fc86d68cff0b2d1fb38c560]]で、少し疑問があります。呼び出している関数の定義側 function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE, $filetime = NULL) で、move to NewPageName のリダイレクト先を読み込んでリストに反映するかを制御している3つ目の引数はTRUE or FALSEフラグ前提で設計されていたような気がするので、本来の意味合いでは $data[] = plugin_bugtrack_list_pageinfo($page['name'], NULL, FALSE, $page['filetime']); の呼び出し方のほうが正しいのではないかと… -- &new{2016-12-01 (木) 21:12:18}; -- ありがとうございます。ご指摘の通りでした -- [[umorigu]] &new{2016-12-01 (木) 23:22:24}; - 対応しました [[commit:5127a22a15]] -- [[umorigu]] &new{2016-12-02 (金) 08:25:49}; - file_get_contents/file_put_contents が flock されてない気がしますね…。 --- a/plugin/bugtrack.inc.php +++ b/plugin/bugtrack.inc.php @@ -299,7 +299,7 @@ function plugin_bugtrack_list_convert() // Cache management $data_updated = true; $cache_filepath = CACHE_DIR . encode($page) . '.bugtrack'; - $json_cached = file_get_contents($cache_filepath); + $json_cached = _pkwk_file_get_contents($cache_filepath); if ($json_cached) { $wrapdata = json_decode($json_cached); if (is_object($wrapdata)) { @@ -386,7 +386,7 @@ EOD; } $json = array('refreshed_at'=>$refreshed_at, 'pages'=>$data, 'version'=>$cache_format_version); $cache_body = json_encode($json, JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES); - file_put_contents($cache_filepath, $cache_body); + file_put_contents($cache_filepath, $cache_body, LOCK_EX); } } $table = array(); @@ -447,3 +447,14 @@ function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE, $file return array($page, $no, $summary, $name, $priority, $state, $category, $filetime); } + +function _pkwk_file_get_contents($filename) { + if (! file_exists($filename)) { + return false; + } + $fp = fopen($filename, 'rb'); + flock($fp, LOCK_SH); + $file = file_get_contents($filename); + flock($fp, LOCK_UN); + return $file; +} こんな感じかな。 -- [[bee]] &new{2016-12-03 (土) 00:30:54}; --- PHP 5.2.5 以前の file_put_contents() にはバグがあるのですが、今回は PHP 5.4 以降のみなので問題ないでしょう。 kannokanno.hatenablog.com/entry/20120624/1340532542 (("php-5.2.5以前のfile_put_contentsではLOCK_EXによる排他ロックは動かない(5.2.6でFix)")) -- [[bee]] &new{2016-12-03 (土) 00:34:08}; -- こんな罠があったとは。採用させていただきます。m(__)m -- [[umorigu]] &new{2016-12-03 (土) 05:50:29}; -- 対応しました [[commit:ef13260aa6]] -- [[umorigu]] &new{2016-12-03 (土) 06:33:16}; - 読み込み権限のないBugTrack listを表示できないようにしました [[commit:574cf886af]] -- [[umorigu]] &new{2017-02-18 (土) 02:04:48}; - [[BugTrack/560]]のキャッシュ判定(recent.datとRecentDeletedが変わっていない場合、変換済みHTMLをそのまま出力)も取り入れて、さらに速度改善しました commit:51239db40c -- [[umorigu]] &new{2018-03-15 (木) 00:56:21}; #comment
テキスト整形のルールを表示する