トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/219

ページの作成や編集にはユーザ登録が必要です。

Conditional Get(条件付き取得)に対応

  • 投稿者: ryon
  • カテゴリ: 新規
  • 優先度: 普通
  • 状態: 提案
  • 日時: 2005年07月12日 14時39分29秒

 内容

Conditional Get(条件付き取得)に対応することでサーバの負荷もネットワークの負荷も減らします。プラグインではなくwiki本体に手を加えます。サーバ負荷軽減効果を出すには、主処理が始まる前に実行する必要があり、プラグイン側でそのように出来るかどうか分からなかったので、とりあえずwiki本体にぶち込むことにしました。プラグイン側に入れて同様の効果が見込めるなら、プラグインに入れるように変更します。

動作は、データディレクトリ内の全ファイルの更新日時とIF_MODIFIED_SINCEの更新日時を比較して、ファイルの方が古いか同じであれば"Status: 304 Not Modified"を出力して強制的に処理を打ち切ります。ファイルの方が新しければ、更新日時を出力してからwiki.cgiを実行します。

 変更点

wiki.cgiの288行からの2行を

print "Pragma: no-cache\n";
print "Cache-Control: no-cache\n\n";

次のとおりに変更

#print "Pragma: no-cache\n";
#print "Cache-Control: no-cache\n\n";
print "\n";

72行目に以下を追加

&conditional_get;

最後に以下を追加

#------------------------------------------------------------------------------
# Conditional Get(条件付き取得)に
#------------------------------------------------------------------------------

sub conditional_get {
	use HTTP::Date;

# action系はキャッシュお断り&更新日出力せず!(LISTを除く)
	if($ENV{'QUERY_STRING'}=~ /^action/ && $ENV{'QUERY_STRING'} ne "action=LIST"){
#		print "Status: 410 Gone\n";					#検索エンジンに登録されたくない時に使用
		print "Cache-Control: no-cache\n";
		print "Pragma: no-cache\n";

# page系処理
	} else {
		my $data_path = $wiki->config('data_dir');

# IF_MODIFIED_SINCEを内部形式に変換
		my $ifmodtime = 0;
		if ($ENV{'HTTP_IF_MODIFIED_SINCE'} ne "") {
			$ifmodtime = str2time($ENV{'HTTP_IF_MODIFIED_SINCE'});
		}
		my $last_modified = 0;

# ディレクトリの更新日時チェック(全ファイルをチェックするよりは早い)
#		my $filemtime = (stat($data_path))[9];
#		$last_modified = $filemtime if ($last_modified < $filemtime);

# ディレクトリ内全ファイルの更新日時チェック
		if (opendir DIR , $data_path) {
			my @files = grep { /\.wiki$/ } readdir DIR;
			closedir DIR;
			return if($#files = 0);
			foreach my $datafile (@files) {
				my $filemtime = (stat("$data_path/$datafile"))[9];
				$last_modified = $filemtime if ($last_modified < $filemtime);
			}

# ディレクトリが無いとき
		} else {
			print "Status: 404 Not Found\n";
			print "Cache-Control: no-cache\n";
			print "Pragma: no-cache\n";
			exit;
		}

# 未更新ならステータス出力して処理打ち切り
		if ($last_modified <= $ifmodtime) {
			print "Content-type: text/html\n";
			print "Status: 304 Not Modified\n\n";
			exit;
		}

# 更新ありなら更新日出力(キャッシュ許可)
		my $date = time2str($last_modified);
		print "Last-Modified: $date\n";
		print "Cache-Control: public\n";
		print "Pragma: public\n";
	}
}

 更新履歴

  • 2005年07月12日 前処理スクリプト版
  • 2005年07月18日 wiki本体改修版

 実働サンプル

http://taste.sakura.ne.jp/test/

二度目以降の読み込みでカウンタが回ってないこと、表示が若干高速になってることを確認してください。

 ライセンス

お・ま・か・せ

 対応バージョン

3.5.8で動作確認済み。

 コメント

お名前: コメント:

最終更新時間:2006年06月30日 12時02分26秒