PEAK XOOPS - Fastest Cache Hack (Experimental version) in englishin japanese






Main : XOOPS Hacks : 

Category: XOOPS Hacks ore     x22       php5
Download Now! Download Now! Fastest Cache Hack (Experimental version) Popular Version: 0.26
Submitted Date:  2006/6/30
Description:
in englishin japanese
== 最速キャッシュハック (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/



Downloaded 16298 times  16298  File Size 5.26 KB  Supported Platforms tar.gz|zip|ore|php5|x22  Home Page http://www.peak.ne.jp/
Modify | Report Broken File | Tell a Friend | Comments (10)


Comments list

fayssal  Posted on 2007/4/27 19:29
thx Gijoe
GIJOE  Posted on 2007/4/27 5:46
Perhaps, it works well even with 2.0.16, though I've never tested it.
fayssal  Posted on 2007/4/27 4:19
hi,is it compatible with xoops2.0.16?
mendow  Posted on 2006/12/12 17:53
Quote:

GIJOE wrotes:
Check it by yourself

I can accept it as the answer "Yes, it is correct" because it works.
GIJOE  Posted on 2006/12/7 5:20
Check it by yourself
mendow  Posted on 2006/12/6 0:59
if I want forbidden FCH for singles documents
have writte correctly...?

I have written so.

define( 'FASTESTCACHE_EXCLUSION_REGEX' , '?(modules/contact|viewpmsg\.php|modules/myalbum/submit_\.php)?' ) ;


It is correct?
tl  Posted on 2006/9/4 5:31 | Last modified
I have a weblink module which consumes MySQL queries like crazy (160!)
I tried to hack fastcache.php, will the following work?

top of the file
global $xoopsModule ;
if( isset( $xoopsModule ) && is_object( $xoopsModule ) ) {
$dirname = $xoopsModule->getVar( 'dirname' ) ;
}

if ($dirname == weblinks ) {
define( 'FASTESTCACHE_EXPIRE_GUEST' , 3600 ) ;
} else {
define( 'FASTESTCACHE_EXPIRE_GUEST' , 300 ) ;
} 

thanks!
tl  Posted on 2006/9/3 1:56 | Last modified
GIJOE:
Do you have any plan turning it into a little module with controllable cache time for each individual module? Per page per module caching would be great!
tl
irmtfan  Posted on 2006/9/2 18:48
i think its a problem in multilanguage hack ( any multi language hack i think) because Google index pages with url but there is same url for 2 languages ( English and Persian)
so google recognize this in persian and ads are not correct: http://www.jadoogaran.org/modules/news
but this is correct: http://www.jadoogaran.org/modules/news/?easiestml_lang=en

now i want to found a way to force google to index site in english. i post a new topic about it in forum
GIJOE  Posted on 2006/8/30 4:45
In developping environment, FCH must be disabled.
In running environment, you should set theme/templates manually.
eg) clean php files under templates_c/

I don't know google adsense well.
Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!