Location : Home > Languages > Perl > Package Title : Algorithm::FloodControls |
![]() |
Algorithm::FloodControl - 時間あたりの事象数を制限
use Algorithm::FloodControl; my $wait = flood_check( 5, 60, 'FLOOD EVENT NAME' ); if( $wait ) { print "Please wait $wait sec. before requesting this resource again."; } else { print "Ok, here you are."; }
"Flood control" メソッドはある特定の時間の間に発生する事象の数を制限したい場合に用いる。たとえば Web サーバへのページリクエストの上限を定めたいときとか、携帯電話でショートメッセージを1時間あたり10メッセージしか受け取りたくない場合など。
本モジュールはいくつかの関数をエクスポートする。
flood_check( $count, $time, $event_name )
本関数はモジュールの核である。事象計測の最大数、この事象計測を行う最大期間(単位は秒)、事象の名称の3つの引数をとる。複数の事象を追跡するために名前で区別するので内部格納用関数 flood_check() もある。
3つめの引数は省略可能である。この場合、事象名称はパッケージ名・ファイル名・呼出し点からのライン数から構築される。しかしながら極めて単純なプログラムでは必要にならない限り使うことは推奨されない。
返り値はこの事象が処理されるまで待たねばならない時間(単位は秒)である。もし即座に終了する場合には 0 を返す。
flood_storage( <$ref> )
内部格納データを保存・復元したい場合(たとえば CGI で使う場合など)は、参照値を返す flood_storage() 関数で参照することができる。FreezeThaw または Storable のような他のモジュールでも可能である。
flood_storage() への単一引数として格納参照を渡さねばならない。
CGI スクリプトは Algorithm::FloodControl の全ての要素が含まれているので使用例として非常に有用である。
#!/usr/bin/perl use strict; use Storable qw( store retrieve ); # 内部データの格納 use LockFile::Simple qw( lock unlock ); # データファイルのロックに用いる use Algorithm::FloodControl; my $flood_file = "/tmp/flood-cgi.dat"; lock( $flood_file ); # 格納データのロック my $FLOOD = retrieve( $flood_file ) if -r $flood_file; # データの読み込み flood_storage( $FLOOD ) if $FLOOD; # 核のデータのロード my $wait = flood_check( 5, 60, 'FLOOD TEST CGI' ); # 量のチェック store( flood_storage(), $flood_file ); # データを格納 unlock( $flood_file ); # ロック解除 print "Content-type: text/plain\n\n"; if( $wait ) { print "Please wait $wait seconds before requesting this page again.\n"; exit; } print "Hello, this is main script here\n";
この例は量制限が有効な場合の一例である。私はこれを IRC ボット用に、電子メールに、ウェブのアップデート等に用いている。
Vladi Belperchinov-Shabanski "Cade", <cade@biscom.net> <cade@datamax.bg> <cade@cpan.org>
http://cade.datamax.bg
$Id: FloodControl.pm,v 1.1 2004/02/29 03:39:24 cade Exp $
![]() |
Updated : 2006/07/14 |