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