Script_OnStart & Script_OnEnd
スクリプトイベントは、global.asaによって定義されたアプリケーション内でのすべてのスクリプトの、どんなコードも実行するよう稼動します。
たびたび、手動的にしろ、ファイルインクルードするにしろ、
各々のスクリプトで同じコードを実行したいことがあるでしょう。
(そんな時には)これらのイベントを使って、
global.asa にあなたのコードを単に加えるだけで、実行されるでしょう。
ここで、一つ警告があります。
Script_OnEnd 内のコードは、$Response->End() がコールされると、
実行は保証されません。
このイベントでは、プログラムはただちに実行終了するからです。
常にクリティカル(重大)なコードを実行するためには、
API拡張を使用してください:
$Server->RegisterCleanup()
Session_OnStart
ユーザセッションの開始がトリガーになり、
Session_OnStart は、ユーザスクリプトの実行前に、稼動します。
また、Session_OnEnd がトリガーされた後に、
その同様のセッションが終了します。
Session_OnStartは、特にデータベースのデータをキャッシュするので、
実行スクリプト内に挿入された体裁の悪いコードにより、
キャッシュが取り扱われることが回避できます。
Session_OnEnd
ユーザセッションの終了時にトリガーされると、Session_OnEndは、後始末をして、セッション中に蓄積されたユーザデータを分析するのに役立ちます。
セッションのタイムアウトが行われ、
StateManager がセッションの後始末を実行すると、セッションは終了します。
Session_OnEnd のタイミングは、セッションのタイムアウト直後にただちにではありませんが、
セッションの失効後も、最初のスクリプトが稼動していると、
StateManagerは、セッションの後始末を行うことができます。
したがって、デフォルトでの、SessionTimeout(20分)および
StateManager(10回) セッティングでの(アクセス)繁多なサイトでは、特定のセッション用の Session_OnEnd は、
そのセッションがアクセスされた最終の活動を過ぎて、22分近くに実行されるべきです。
(アクセスが)少ないサイトでは、引き続きの訪問の時には、 Session_OnEnd が実行するだけでしょう。
また、理論上では、過去のアプリケーションの最後セッションは、Session_OnEnd を走らせません。
したがって、私は、Session_OnEnd は、実行される時はいつも、
快適であるべき要素ですので、必要不可欠なもの以外は設定していません。
Script_OnFlush
API 拡張です。このイベントは、ウェブのクライアントへの
$Response バッファをフラッシュするのに先立って、コールされます。
この時に、$Response->{BinaryRef} バッファーを参照すると、
すべてのスクリプトの変更なしに、スクリプトへのグローバルな変更を適用するランタイムとして、バッファーを用いた出力(だけ)を修正できます。
sub Script_OnFlush {
my $ref = $Response->{BinaryRef};
$$ref =~ s/\s+/ /sg; # 余分なスペースを削除
}
この用途の実例として、./site/eg/global.asa を調べてください。
Application_OnStart
このイベントは、ASP アプリケーションの開始の目印です。
アプリケーションでは、最初のセッションの Session_OnStart の前に実行されます。
このイベントは、すべてのユーザセッションに於て、データを持つ、
$Application を掲載するのに有用です。
Application_OnEnd
このイベントは、所与のアプリケーションで、
最終セッションがタイムアウトする前に、実行する
ASP アプリケーションの終了の目印です。
Server_OnStart ( 疑似イベント )
ウェブサーバスタートの際、あるコードを実行させる、
Server_OnStart イベントのようなものがあればいいと願う人もいることでしょう。
mod_perl では、httpd.conf ファイルに <Perl> セクションの中に、
ある初期化コードを入れることで、ASP アプリケーションの(記述)範囲とは別に簡単に実現できます。
チャイルドプロセスの httpdと共有させたい初期化(コード)は特に有用です。
チューニング セクション−プリコンパイルサブセクションで詳細に述べられている、Apache::ASP->Loader() ルーチンは、その一例で、次のようにコールされます。
# httpd.conf
<Perl>
Apache::ASP->Loader($path, $pattern, %config)
</Perl>
これで、<Perl> セクションはあなたのServer_OnStart ルーチンとなります。
mod_perl handlers
mod_perl
ハンドラで、自分の環境を拡張するのを、Apache::ASPは妨げません。
実際に、Apache::ASPの基礎となる使い方では、以下のように、
mod_perl の PerlHandler の過程を必要とします。
SetHandler perl-script
PerlModule Apache::ASP
PerlHandler Apache::ASP
しかし、mod_perlでは、さらに多くの、Apache イベントリストに直接アクセスできます。
全面的なリストを見るには、"perldoc mod_perl" とコマンドを試みるか、
mod_perl Eagle本を購入してください。
通常よく使用される(ハンドラ)は以下の通りです。
PerlInitHandler
PerlTransHandler
PerlFixupHandler
PerlHandler
PerlLogHandler
PerlCleanupHandler
直接に、Apache::ASPでプログラミングするなら、いくつかの等価物があります。
例えば、Init/Fixup ステージの代りに、 Script_OnStart イベント、
あるいは、 Log/Cleanup ステージの代りに、$Server->RegisterCleanup() です。
しかし、特に、ASP スクリプトではなく、すべてのファイルをグローバルに扱いたい時に、
Apache::ASP ではできなくとも、mod_perl ハンドラでは行うことができます。
Apache::ASP をはじめとする、mod_perl 関連の多くのApache::* モジュールは、
http://perl.apache.org/src/apache-modlist.html を調べてください。
non-PerlHandler mod_perl ハンドラ外での$Sessionのような、
ASPオブジェクトへアクセスするためには、次のように、APIが使用できます。
my $ASP = Apache::ASP->new($r); # $r は、Apache->request オブジェクト
Authen(認証)ハンドラでは、以下が可能です。
<Perl>
use Apache::ASP;
sub My::Auth::handler {
my $r = shift;
my $ASP = Apache::ASP->new($r)
my $Session = $ASP->Session;
}
</Perl>
ここで、自分でもできる mod_perl ハンドラプログラミング例を
いくつかあげておきます。
=== HSlide を含む ユーザエージェント(からのアクセス)を禁止する ===
# httpd.conf
PerlAccessHandler My::Access
<Perl>
sub My::Access::handler {
my $r = shift;
if($r->header_in('USER_AGENT') =~ /HSlide/) {
403;
} else {
200;
}
}
</Perl>
=== ランタイムのパスをパース ===
この例は、任意のURLパス /$path/$file.aspをとっても、あなたのサイト用のランタイム設定に変更するので、したがって、スクリプトは、あなたのサイトでの、(httpdでの) DocumentRootで常に実行することができます。
INPUT URL /SomeCategory/
OUTPUT
Script: index.asp
$Server->Config('PATH') eq '/SomeCategory'
INPUT URL /SomeCategory/index.asp
OUTPUT
Script: index.asp
$Server->Config('PATH') eq '/SomeCategory'
INPUT URI /index.asp
OUTPUT
Script: index.asp
$Server->Config('PATH') eq ''
# httpd.conf
PerlTransHandler My::Init
use lib qw( $custom_perllib );
# $custom_perllib/My/Init.pm
package My::Init;
use strict;
use Apache::Constants qw(:common);
sub handler {
my $r = shift;
my $uri = $r->uri || '/';
unless($uri =~ m|^(.*)(/([^/.]+\.[\w]+)?)$|i) {
warn("can't parse uri $uri");
return DECLINED;
}
$uri = $2;
my $PATH = $1 || '';
$r->dir_config('PATH', $PATH);
if($uri eq '/') {
$uri = '/index.asp';
}
$r->uri($uri);
$r->filename($r->document_root.$uri);
DECLINED;
}
1;