Category::Plugin

bugtrack_listの高速化

  • ページ: BugTrack2
  • 投稿者: umorigu
  • 優先順位: 普通
  • 状態: 完了
  • カテゴリー: プラグイン
  • 投稿日: 2016-11-30 (水) 00:54:25
  • バージョン: 1.5.1
  • リリース予定バージョン: 1.5.2

メッセージ

bugtrack_listは、表示時に列挙対象の全ページを読み込むのでサーバー負荷が高く、また表示に時間がかかっている。

表示項目を適切にキャッシュすることで、表示の高速化とサーバー負荷軽減を実現したい。

仕様:

  • PHP5.4以降でキャッシュが有効 (5.4未満ではキャッシュされない。bugtrack_list自体は動作する)
  • 更新日時が変わらないページのデータがキャッシュされる
  • キャッシュの有効期限は最大24時間。生成から24時間経った後の最初のリクエストで、キャッシュデータが再作成される
    • この仕様のため、リスト生成が1リクエスト中に完了しない量のデータでは動作しない (従来通り)

  • tracker_listの高速化のチケットはありましたが、bugtrack_list単体のものはなかったので立てました。tracker_listとbutrack_listの仕組みは似ているため、tracker_listの高速化のヒントになると思います。また、bugtrack_listの方がシンプルで高速化の対応も容易だと踏んでいます -- umorigu 2016-11-30 (水) 00:57:22
  • しかしbagtrack_listをヘビーに使っているのは世界中でこのサイト(pukiwiki-dev)だけかもしれません :-) -- umorigu 2016-11-30 (水) 00:58:13
  • 更新時刻ベースのキャッシュを試作してみました。 pukiwiki.osdn.jp/_dev3/?BugTrack キャッシュなしでは4-7秒のところ、キャッシュを実装して1秒台で表示できるようになっています -- umorigu 2016-11-30 (水) 03:08:49
  • 👍 -- bee 2016-12-01 (木) 12:19:20
    • (主題と全く関係ないのですが)Android 版 Firefox で絵文字が見えない…。 -- bee 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']);
    の呼び出し方のほうが正しいのではないかと… -- 2016-12-01 (木) 21:12:18
    • ありがとうございます。ご指摘の通りでした -- umorigu 2016-12-01 (木) 23:22:24
  • 対応しました commit:5127a22a15 -- umorigu 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 2016-12-03 (土) 00:30:54
    • PHP 5.2.5 以前の file_put_contents() にはバグがあるのですが、今回は PHP 5.4 以降のみなので問題ないでしょう。 kannokanno.hatenablog.com/entry/20120624/1340532542 *1 -- bee 2016-12-03 (土) 00:34:08
    • こんな罠があったとは。採用させていただきます。m(__)m -- umorigu 2016-12-03 (土) 05:50:29
    • 対応しました commit:ef13260aa6 -- umorigu 2016-12-03 (土) 06:33:16
  • 読み込み権限のないBugTrack listを表示できないようにしました commit:574cf886af -- umorigu 2017-02-18 (土) 02:04:48
  • BugTrack/560のキャッシュ判定(recent.datとRecentDeletedが変わっていない場合、変換済みHTMLをそのまま出力)も取り入れて、さらに速度改善しました commit:51239db40c -- umorigu 2018-03-15 (木) 00:56:21


*1 "php-5.2.5以前のfile_put_contentsではLOCK_EXによる排他ロックは動かない(5.2.6でFix)"

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-17 (土) 09:33:58
Site admin: PukiWiki Development Team

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

OSDN