=encoding euc-jp =head1 名前 (NAME) Apache::SSI - Perl での Server Side Includes の実行 =head1 概要 (SYNOPSIS) httpd.conf 内: # または何らか SetHandler perl-script PerlHandler Apache::SSI あなたは Apache::SSI サブクラスで独自拡張ができます。もしそうするなら PERL_METHOD_HANDLERS=1 とあわせて mod_perl をコンパイルしてください (そうすれば オブジェクト指向継承が利用可能です)。そしてモジュールをこのように作って下さい: package MySSI; use Apache::SSI (); @ISA = qw(Apache::SSI); #埋め込みシンタックス: # sub ssi_something { my($self, $attr) = @_; my $cmd = $attr->{param}; ... return $a_string; } そして httpd.conf 内は: SetHandler perl-script PerlHandler MySSI =head1 説明 (DESCRIPTION) Apache::SSI は、HTML サーバ解析処理のための mod_include の機能を実行します。 これは Apache の mod_perl 下で動作します。 私の考えでは、このモジュールが有用であるかも知れない、主な理由が二つあります: 独自カスタム SSI 命令を実行するためのサブクラスが使えます。そして/または、 他の mod_perl ハンドラの出力を解析出来、また、SSI 出力を他のハンドラへ 送ることができます (その場合 Apache::Filter を利用して下さい)。 各 SSI 命令は Apache::SSI の、接頭辞 "ssi_" のメソッドによって処理されます。 例えば、 は ssi_printenv メソッドによって処理されます。 SSI タグ内の属性=値のペアは、解析され、ハッシュリファレンスで メソッドに渡されます。 'Echo' 命令は、ssi_echo メソッドによって処理され、その委任されたメソッドが、 接頭辞 "echo_" のメソッドを調べます。例えば、 は echo_DOCUMENT_NAME メソッドに処理されます。 Apache::SSI から継承し 'ssi_*' や 'echo_*' メソッドをオーバーライドするか、 新規のメソッドを書くことにより、挙動をカスタマイズできます。 =head2 SSI 命令 (SSI Directives) このモジュールは mod_include と同じ命令をサポートします。少なくとも、 それが目標です。=) 以下に一覧されながら、文書化されていないメソッドについては、 http://www.apache.org/ で mod_include のオンラインドキュメントをご覧下さい。 =over 4 =item * config =item * echo =item * exec =item * fsize =item * flastmod =item * include =item * printenv =item * set =item * perl Perl 関数を呼び出す方法は二つあり、そして引数を与える方法が二つあります。 関数は無名サブルーチンリファレンスによる指定、 あるいは他で定義済みの関数名での指定のどちらかでできます。 もし sub 引数が、正規表現 /^\s*sub[^\w:]/ にマッチすると、 サブルーチンリファレンスとみなされます。マッチしなければ、関数名とみなされます。 後者の場合で、関数名に "::" が含まれていない場合に、"main::" 文字列が 関数名の先頭に付加されます (これは関数が main パッケージか、あなたの指定する パッケージ内にあることを強制します)。これは、あなたのコードを main パッケージに置くための非常に悪い考えなので、私は気乗りせず この特徴を是認しているだけである事に注意してください。 大抵、無名サブルーチンを使うと、より遅くなります。なぜなら、それぞれは eval() されなければならず、キャッシュされないためです。 最善策をとるなら、親プロセス内に必要なコードをプリロードしておき、 そして関数名でそれを呼び出してください。 もし "&Package::SubPack::handler" のようなサブルーチンを呼び出す場合は "handler" の部分は省略可能で、このようにできます: もしあなたが関数に引数のリストを与えたいなら、"arg" か "args" の どちらかのパラメータを使います: "args" パラメータは簡単なカンマ分割をします。今のところ "args" パラメータを介した場合、引数内にカンマを埋め込む方法が存在しないことを 意味します。その場合は "arg" パラメータを使って下さい。 もしキーと値のペアを与えたくて、キーが 'sub', 'arg', 'args', または 'pass_request' (以下参照) でなければ、あなたのルーチンへはキーと値の B<両者> が渡されます。これはあなたの関数へ、キーと値のペアになった ハッシュを渡させます: これは &holy::matrimony('groom', 'Hi', 'bride', 'Lois'); を呼びます。 バージョン 1.95 の時点で、私達は現在の Apache リクエストオブジェクト ($r) を 第一引数として関数に渡します。これを抑制するには、'pass_request=no' という、 キーと値のペアを渡すか、あなたのサーバ設定ファイル内に 'PerlSetVar SSIPerlPass_Request no' を設定してください。 Perl SSI 呼び出しに関する詳細情報は C をご参照下さい。 =item * if =item * elif =item * else =item * endif これらの四つの命令は C と同じように使われます。一点の 重要な違い: ブール式は、Perl の eval() を使用して評価されます。これは、 等価比較で C<=> に代わり C<==> か C を使用する事、また、条件式に プリロードされた Perl サブルーチンを使用することが出来る事も意味します: This movie is by the Coen Brothers. This movie is not by the Coen Brothers. もっとも、とても複雑な Perl の処理はできません。なぜならそれは手作業で (C のように $var または ${var} 形式の) 変数を探し、 $object->method または $hash{'key'} のような表記には間違えさせられるからです。 Apache の変数に記入している間に、Perl 独自の表記を許可する方法について どんな提案でも歓迎します。 =back =head1 ハンドラのチェーン化 (CHAINING HANDLERS) スタックされたハンドラのチェーン内にこのモジュールを存在させるため、 とても簡単な方法が二つあります。第一に C を使い、そして あなたの httpd.conf はこのような感じでしょう: PerlModule Apache::Filter PerlModule Apache::SSI PerlModule My::BeforeSSI PerlModule My::AfterSSI SetHandler perl-script PerlSetVar Filter On PerlHandler My::BeforeSSI Apache::SSI My::AfterSSI C<"PerlSetVar Filter On"> ディレクティブは三つのスタックされたハンドラに それらをフィルタリングモードにすべきだと命じます。これは必須です。 第二に C を使い、そしてあなたの httpd.conf は このような感じでしょう: PerlModule Apache::OutputChain PerlModule Apache::SSIChain PerlModule My::BeforeSSI PerlModule My::AfterSSI SetHandler perl-script PerlHandler Apache::OutputChain My::AfterSSI Apache::SSIChain My::BeforeSSI このハンドラの順番は、二つの異なるメソッドで逆順にされる事に注意してください。 一つの理由は、私が書いた C は、順番をより直感的にさせます。 もう一つの理由は、C は、これ自体が C を使う スタックハンドラで使われる事が出来る事です。それゆえに、C と一緒に使われるには、C にラップされている必要があります。 より明確な情報は C と C のドキュメントを ご覧下さい。そして、警告 (CAVEATS) の中の注記も見てください。 =head1 警告 (CAVEATS) * Apache::Filter を介してハンドラをチェーン化した時に、もし または を使う場合、Apache::SSI はチェーン内の最後のフィルタ でなければなりません。これは Apache::SSI がファイルのインクルードのために、 $r->lookup_uri(...)->run を使い、これは Perl の STDOUT ではなく、 むしろ C の stdout へ出力を送るからです。従い Apache::Filter には 出力の捕捉やフィルタが出来ません。 もし Apache::SSI がチェーン内の最後のフィルタであるか、あなたが , 等の簡単な SSI 命令を貼り付けるのなら問題ないでしょう。 * 現在の、 が変数を探す方法は、最初に $r->subprocess_env を試み、次に %ENV を試み、そして五つの追加環境変数は mod_include が提供します。この順序は正しいでしょうか? =head1 行うこと (TO DO) http://www.apache.org/docs/mod/mod_include.html を再訪し、私が出来ることが 他に何かないかを見ること。 ファイルをインクルードする時に十分に発達したサブリクエストを実行するか、 または、ただファイルを開いて出力するか、このどちらかを選択させる "PerlSetVar ASSI_Subrequests 0|1" オプションを持つことは素敵でしょう。 real.t テストのために Apache::test の使い方を知りたい。 =head1 参考資料 (SEE ALSO) mod_include, mod_perl(3), Apache(3), HTML::Embperl(3), Apache::ePerl(3), Apache::OutputChain(3) =head1 作者 (AUTHOR) Ken Williams ken@forum.swarthmore.edu 基本概念は Doug MacEachern dougm@osf.org によるオリジナルバージョン。 実装は異なる。 =head1 著作権 (COPYRIGHT) Copyright 1998 Swarthmore College. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 翻訳者 谷口公一 Etaniguchi@users.sourceforge.jpE