

== THE FASTEST CACHE HACK for XOOPS ==
SUMMARY:A hack for Page Caching of XOOPS.
This hack is not for novices but for experts.
USAGE:(1) copy fastestcache.php into your XOOPS_ROOT_PATH/include/
(2) make a new folder out of DocumentRoot eg) /home/yourhome/xoops/
(3) make a new folder named "fullcache" under the folder made in step2. Then, chmod 777 fullcache/ .
(4) insert a line into just after defining XOOPS_URL in mainfile.php. (Edit '/home/yourhome/xoops')
define('XOOPS_TRUST_PATH','/home/yourhome/xoops');
(5) insert a line into just before including common.php (out of if part) in mainfile.php.
require XOOPS_ROOT_PATH.'/include/fastestcache.php' ;
If you use EMLH, this line should be inserted after EMLH.
If you use Protector, this line should be inserted just before precheck.
(6) insert a line into just after including common.php (inside if part) in mainfile.php
if (!isset($xoopsOption['nocommon']) ... ) {
include XOOPS_ROOT_PATH."/include/common.php";
fastestcache_setcookie() ; // Insert this
}
(7) open include/functions.php and insert a line into the top of function redirect_header().
function redirect_header($url, $time = 3, $message = '', $addredirect = true)
{
fastestcache_clearcache() ; // Insert this
global $xoopsConfig, $xoopsRequestUri, $xoopsLogger, $xoopsUserIsAdmin;
If you've updated XOOPS core version, patch include/functions.php again.
CHANGELOG2006-06-30 0.26
- fixed the judgement whether content is html or not (thx suin)
2006-06-27 0.25
- modified for environment with empty $_SERVER['REQUEST_URI']
2006-02-23 0.24
- fixed register.php can't be cacheable
2006-02-19 0.23
- fixed a bug on login'in and login'out. (thx biroron)
- disabled any caches for admin areas
2006-02-13 0.22
- added a configuration of a regex pattern for excluding some URIs.
2006-01-29 0.21
- fixed a bug about user cannot register (thx harasaki)
2006-01-03 0.20
- added two configurations (cache lifetime is separated by 2 - users&guests)
- removing session_id() in the contents before storing it
- fixed a bug with the login reflection
2005-12-30 0.11
- added the English document
- removed some debugging codes
2005-12-29 0.10
- The 1st experimental version
by GIJOE
http://www.peak.ne.jp/xoops/[xlang:ja]
== 最速キャッシュハック (FCH) ==
●特長
ページまるごと単位でキャッシュする高速化ハックです。
ただし、使い方はそれなりに難しい上に、セッションについての危険性を理解していないと思わぬセキュリティホールの原因になりますので、決して初心者向きではありません。ご注意ください。
また、拙作HackであるEMLHやオートログインとの相性問題だけは一応解決してありますが、他のHackとのバッティングの可能性は捨て切れません。
●有効性
実はこのHackが有効となるケースはかなり限られています。頻繁にアクセスがあるサイトで、サーバ負荷が問題になっている場合でなければ、ほとんど意味がないでしょう。
アクセス数が少ないサイトであれば、キャッシュもほとんどヒットしませんし、キャッシュの生成によるオーバーヘッドでむしろ遅くなるだけです。
なお、このHackは原理的に、カウンターやアクセス解析モジュールは有効になりません。それらを使いたい場合にも、利用はお勧めできません。
●使い方
(1) このアーカイブに含まれる fastestcache.php をXOOPSインストールディレクトリのinclude/ディレクトリにコピーして下さい。
(2) DocumentRootの外のディレクトリに専用のフォルダを一つ作ってください。そのパスを仮に、/home/yourhome/xoops/ とします。
(3) そのフォルダの下に fullcache というディレクトリを作成し、httpdへの書込権限を与えてください(一般的には、chmod 777)
(4) mainfile.phpを開いて、XOOPS_URL定義行の直後に、
define('XOOPS_TRUST_PATH','/home/yourhome/xoops');
と一行追加してください。(/home/yourhome/xoopsの部分は適宜書き換えてください)
(5) mainfile.php の common.php 呼び出し部分の前(if文の外側)に、一行追加します。EMLHを入れているなら、その後にします。Protectorを入れているなら、precheck読込の前です。
require XOOPS_ROOT_PATH.'/include/fastestcache.php' ;
(6) mainfile.php の common.php 呼び出し部分の直後(if文の内側)に、一行追加します。if文の内側であることに注意してください。当然、Protectorのpostcheckより前となります。
if (!isset($xoopsOption['nocommon']) ... ) {
include XOOPS_ROOT_PATH."/include/common.php";
fastestcache_setcookie() ; // この行を挿入
}
(7) include/functions.php を編集して、関数redirect_header()の最初の部分に以下のように1行追記します。
function redirect_header($url, $time = 3, $message = '', $addredirect = true)
{
fastestcache_clearcache() ; // この行を追加
global $xoopsConfig, $xoopsRequestUri, $xoopsLogger, $xoopsUserIsAdmin;
以上、手順としてはかなり長くなりましたが、XOOPSのバージョンアップによって破壊される可能性があるのは、include/functions.php の追記部分だけだと思います。バージョンアップで破壊されたら、(7)の1行挿入だけ行ってください。
●動作原理
このHackは基本的に、出力フィルターを利用しています。出力フィルターの処理部分で、XOOPS_TRUST_PATH/fullcache/ 以下に、ページまるごとのキャッシュを保存するわけです。
ページの区別は、REQUEST_URIベースであり、以前のアクセスと同一のREQUEST_URIが来たら、キャッシュからデータを読み出して終了します。この場合、ほとんどのモジュールではデータベース接続処理すらありませんので、極めて高速に処理が終了します。F5アタックをかけても、サーバのダメージはほとんどないと言えるレベルです。
もちろん、ユーザが違えば、表示される内容もちがうので、ゲストではない、ログインユーザについては、セッションID毎にキャッシュを区別しています。
このキャッシュが画期的なのは、投稿したのに内容が反映されない、というキャッシュ特有の問題を、redirect_header() 関数のHackで解決している、という点です。
ほとんどのモジュールは、投稿などの処理を行った後は、redirect_header() を呼んでいます。つまり、redirect_header()が呼ばれた時点で、そのユーザの持つキャッシュをすべてクリアすれば、投稿が即座に反映されるわけです。
このキャッシュでの最大の問題点は、多言語Hackとの兼ね合いです。同じREQUEST_URIでありながら、クッキーやACCEPT_CHARSETなどによって処理を変えなくてはいけないのは、かなりのボトルネックとなってしまいます。特に難しいのが、HTTPレスポンスヘッダにおけるcharset指定です。
そのために、EMLH側での対応が必要となってしまいました。最速キャッシュハックと、EMLHを併用する場合は、EMLHを1.23以上に上げてください。mainfile.php内での順番も重要で、先がEMLHで、その後に最速キャッシュハックであることに注意してください。(Protectorはさらにその後)
ちなみに、FCHのヒット率は、PEAK XOOPSで平均20%前後です。これを効果有りと見るかどうかは微妙なところですが、いわゆる高速化よりも、悪意のない連続アクセスが防げて、サーバ負荷が一時的に極端に大きくなることが避けられる、という方にこそ意味がありそうです。
また、コンテンツがさほど多くないサイトであれば、キャッシュのヒット率ももう少し上がるものと期待されます。
あと、ゲストについては、セッションIDが異なっていても同一のキャッシュとして扱っているため、サイトコンテンツにセッションIDが埋め込まれるケースでは問題があります。FCH内部で、session.use_trans_sid をoffにしていますが、明示的にセッションIDをリンクURIとして書き出すモジュールも可能性として考えられるので、それらのモジュールを利用している場合には、このハックを適用するべきではありません。悪意のないセッションハイジャックが起きる可能性があります。(一応、0.20で、そういうことのないようなフィルターをかけるようにしましたが…)
●TODO
除外モジュール機能
●変更履歴
2006-06-30 0.26
- HTML文書かどうかの判断基準の修正 (thx suin)
2006-06-27 0.25
- $_SERVER['REQUEST_URI'] が空の環境への対応 (cronによるローカル読み出しなど)
2006-02-23 0.24
- ユーザ登録画面(register.php)はキャッシュしないように仕様変更
2006-02-19 0.23
- ログイン・ログアウトがらみのバグの修正 (thx biroron)
- 管理画面っぽいURIを見つけた時点で、キャッシュしないように仕様変更
2006-02-13 0.22
- 除外モジュール(正確には「除外すべきURI正規表現」の追加)
2006-01-29 0.21
- ユーザ登録が出来なくなっていた不具合の修正 (thx harasaki)
2006-01-03 0.20
- 設定項目が増えた(ゲスト用のキャッシュ時間とユーザ用のキャッシュ時間分離など)
- コンテンツ中にセッション鍵が見つかっても保存しないようにした
- ログインが反映されずゲスト状態のままに見えるバグの修正
2005-12-30 0.11
- 英語のドキュメントを書いた
- デバッグ用のコードが残っていたのを修正
2005-12-29 0.10
- FastestCacheHack 実験版としてのリリース
by GIJOE
http://www.peak.ne.jp/xoops/[/xlang:ja]