2016/09/11(日)RecentChangesページを考慮したブラウザキャッシュ制御
PukiWiki: RecentChangesページを考慮したブラウザキャッシュ制御
PukiWiki If-Modified-Since(条件付きリクエスト)対応のコメントでやりとりしていた、RecentChangesページを考慮したブラウザキャッシュ制御の機能をbodycache改良版に追加しました。
PukiWiki bodycache改良版のページで公開しています。なお、追加機能を使うには設定が必要です。*1
RecentChangesを考慮したページ更新日時
基本的な方針は、「Wikiページキャッシュ更新日時とRecentChanges更新日時のうち新しい方」をページの更新日時と見なすというものです。
以下の関数がこの新しい方の更新日時を返す関数です。$bodycache_lastmod_whatsnewはpukiwiki.ini.php内の設定で、$bodycache_lastmod_whatsnewがtrueの時のみこの機能は動作します。
- bodycache.php
// Get last-modified time for client side cache control function get_lastmodtime($page) { global $bodycache_lastmod_whatsnew; global $whatsnew; static $lastmodtime = null ; if ($lastmodtime !== null) { return $lastmodtime ; } $cachetime = get_cachetime($page); if ( $cachetime != 0 && $bodycache_lastmod_whatsnew ) { $whatsnewtime = get_filetime($whatsnew); $lastmodtime = ( $cachetime >= $whatsnewtime ) ? $cachetime : $whatsnewtime; } else { $lastmodtime = $cachetime; } return $lastmodtime; }
この関数が返す日時を、ブラウザに返却するLast-Modifiedや、If-modified-sinceの比較に用いることで、RecentChanges更新時にはブラウザキャッシュも更新される動作になります。
追記
get_lastmodtimeは複数回呼ばれるので、処理量を減らすために1回目に呼ばれたときの結果を$lastmodtimeに残して2回目以降は$lastmodtimeを返すだけにしているのですが、今の書き方では引数の$pageを変更して呼ばれると正しく動作しなくなってしまいます。
今のコードでは、$pageを変更してget_lastmodtimeを呼ぶことはないので問題は起こりませんが、get_lastmodtimeの引数を変えてはいけないという制約ができてしまっているのであまり良くないですね。(うっかり忘れて将来事故を起こしそう^^;)そのうち修正するかもしれません。
その他のbodycache改良版の更新
更新のついでに、bodycache.php内の不要な記述の削除とコードインデントのタブへの統一*2も実施しました。
また、bodycache.php内にあった設定用の変数$bodycache_del_depthをpukiwiki.ini.phpに移動しました。
2016/07/30(土)さくらのレンタルサーバーにPHP7を導入
2016年12月14日からPHP7.1が使用できるようになったので、この作業をする必要は無くなりました。→さくらのレンタルサーバ PHP7.1 提供開始のお知らせ | さくらインターネット
さくらのレンタルサーバーにPHP7を導入
さくらのレンタルサーバーがなかなかPHP7に対応しないので自力でインストールしてみました。
注意:この方法でPHP7を導入した後は、自身の責任においてセキュリティーアップデート(最新版の再導入)をしてください。
PukiWiki 多重includeの深さ制限
PukiWiki 多重includeの深さ制限
多重include(includeの中でincludeを使う)の深さを制限できる改造版includeを作成しました。
制限を超えると、エラーメッセージ
#include(): Limit exceeded (recursive): ページ名
が表示されます。
使い方
- 設定
- 添付のinclude.inc.php内のPLUGIN_INCLUDE_MAX_DEPTHを、必要に応じて変更します。
// Max depth of recursive include define('PLUGIN_INCLUDE_MAX_DEPTH', 2);
- 1で多重include禁止、2で二重まで許可。以降数字を増やすごとに許可される深さが増えます。
- 0は無制限(もとのincludeと同じ)。
- PukiWiki bodycache改良版のデフォルト設定は、二重includeまで対応しています。ただし、pcommentも含めて二重なので、pcommentで深さを1つ消費すると考えるとPLUGIN_INCLUDE_MAX_DEPTHの設定は1にするのが良いでしょう。
- 添付のinclude.inc.php内のPLUGIN_INCLUDE_MAX_DEPTHを、必要に応じて変更します。
- 設置
- include.inc.phpを、PukiWikiに元からあるinclude.inc.phpと置き換えます。
参考:改造内容
- 上の方に設定値を追加
// Max depth of recursive include define('PLUGIN_INCLUDE_MAX_DEPTH', 2); // e.g. // PLUGIN_INCLUDE_MAX_DEPTH=0: no prohibition // PLUGIN_INCLUDE_MAX_DEPTH=1: prohibit recursive include
- function plugin_include_convertの冒頭に変数$depthを追加。
function plugin_include_convert() { global $script, $vars, $get, $post, $menubar, $_msg_include_restrict; static $included = array(); static $count = 1; static $depth = 1; //追加
- PLUGIN_INCLUDE_MAX判定の直後に、PLUGIN_INCLUDE_MAX_DEPTHの判定を追加。*1
if (isset($included[$page])) { return '#include(): Included already: ' . $link . '<br />' . "\n"; } if (! is_page($page)) { return '#include(): No such page: ' . $s_page . '<br />' . "\n"; } if ($count > PLUGIN_INCLUDE_MAX) { return '#include(): Limit exceeded: ' . $link . '<br />' . "\n"; } if ($depth > PLUGIN_INCLUDE_MAX_DEPTH && PLUGIN_INCLUDE_MAX_DEPTH > 0) { //追加 return '#include(): Limit exceeded (recursive): ' . $link . '<br />' . "\n"; //追加 } else { ++$count; }
- convert_htmlの前後に、$depthのインクリメントとデクリメントを追加。
if (check_readable($page, false, false)) { ++$depth; //追加 $body = convert_html(get_source($page)); --$depth; //追加 } else { $body = str_replace('$1', $page, $_msg_include_restrict); }
関連記事
添付
- include_max_depth_20160625.zip
- include.inc.php: 改造版include、元のincludeと差し替える。PukiWiki 1.5.1用。
ライセンスはGPLv2 or laterです。(PukiWikiと同じ。)
PukiWiki bodycache改良版
ECO-Wiki (acronia)で使っている改良したPukiWiki bodycacheの改良内容とソースコード(パッチ)。