Apache :: ASP
< % Web Applications with Apache & mod_perl % >
はじめに
インストール
設定
構文
% イベント
オブジェクト
SSI
セッション
XML/XSLT
CGI
PERLスクリプト
FAQ
チューニング
謝辞
サポート
使用サイト
リソース
計画
履歴
ライセンス

実例

ASP 工作室
日本語訳について

Powered by Apache::ASP
Powered by ModPerl and Apache
Powered by Perl
Links Checked by NodeWorks
SourceForge.jp
イベント


概観 Application_OnStart
Script_OnStart & Script_OnEnd Application_OnEnd
Session_OnStart Server_OnStart ( 疑似イベント )
Session_OnEnd mod_perl ハンドラ
Script_OnFlush  

概観


	

ASPプラットフォームで、開発者がウェブ・アプリケーションを作成することができます。 (すなわち)実際のソフトウェアが必要とする条件の履行では、ASPは、global.asaファイルに定義される、イベントトリガー(イベントに応じた)アクションを可能にします。 グローバルディレクトリーにある、global.asa ファイルでは、設定オプションとして、以下のアクションが定義されます。
	      アクション               イベント
	      ----------               --------
	  Script_OnStart *      スクリプト実行の冒頭。
	  Script_OnEnd *        スクリプト実行の末尾。
	  Script_OnFlush *      $Response が、クライアントへフラッシュする時。
	  Application_OnStart   アプリケーションでの冒頭。
	  Application_OnEnd     アプリケーションでの末尾。
	  Session_OnStart       ユーザセッションの冒頭。
	  Session_OnEnd         ユーザセッションの末尾。

  * これらの、API は、移植可能ではありませんが、非常に有益なので追加しました。
		
これらのアクションは、$Global/global.asa ファイルの中で サブルーチンとして定義されなければなりません。例えば、
  sub Session_OnStart {
      $Application->{$Session->SessionID()} = started;
  }
		
です。

セッションを理解することは容易です。 ウェブアプリケーションのページを訪れた場合、各ユーザに、 単一の $Session(という変数)が与えられます。 セッションが終了し、再訪する場合、ユーザは、また、 新しい $Sessionを持つことになります。
ユーザがページを訪れると、ウェブアプリケーションは開始され、 新しい $Session が作られます。 最初の、$Session の生成直後に、$Application 作られます。 最後のユーザ $Sessionが終了すると、$Applicationも、終了します。 常時繁多にアクセスされる、いくつかのウェブアプリケーションでは、 Application_OnEndのイベントは生じないかもしれません。

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;
 
Copyright © 1998-2002, Joshua Chamas, Chamas Enterprises Inc.