| ●mod_perl とは? |
| Apache モジュール内にラップされた完全な Perl
インタプリタ のことです。 通常 Perl で書かれたスクリプトを実行するには毎回 perl インタプリタを呼び出しコンパイル・実行されます。 ところが mod_perl の場合は一度呼び出された後はコンパイルされた状態のまま apache 内で次のリクエストを待ち続けます。 つまり perl スクリプトが apache の機能として実行されます。 一説には普通の perl スクリプトと比較すると200倍速いとされています。 他のメジャー言語である php などと比較しても速い実行結果があるようです。 巷では「perl は遅いから…」とよく言われてますが遅いという理由だけで C言語 や PHP などでコードを書く必要はありません。 apache + mod_perl これ最強です。 |
| ●インストール |
| 既にApacheが DSO (Dynamic Shared Object)対応で構築済みの場合は、mod_perl
モジュールのみ生成するだけです。 DSO 対応か調べるにはコンソールから # httpd -l上記のように mod_so.c が現れれば DSO に対応していることが分かり
ます。 |
| ●設定ファイルの編集 |
| Apacheのコンフィギュレーションで、mod_perl
関連の設定を行う必要があります。 まずはモジュールのロードですが、DSO で入れた場合は以下のような設定になります。
LoadModule perl_module modules/libperl.so <--これは/usr/lib/apache/libperl.soと等価です
|
| ●スクリプトの実行 |
| ロケーションセクションで指定したディレクトリにスクリプトを設置し、エイリアスを指定してスクリプトを起動することで、
mod_perlでの実行が可能です。 /home/httpd/perl ディレクトリにある、test.pl を Apache::Registry 配下で実行するには、以下のようなURL指定になります。 http://domain_name/perl/test.pl 同様に以下のような指定で、Apache::PerlRun での実行を指定できます。 http://domain_name/cgi-perl/test.pl また、通常の CGI は mod_perl 用エイリアス以外を指定することで実行可能です。 http://domain_name/cgi-bin/test.pl http://domain_name/~xxxxxx/xxxxx/hoge.pl ※cgiファイル互換で動かす場合は以下のように <Files *.cgi> SetHandler perl-script PerlHandler Apache::Registry PerlSendHeader On </Files> |
| ●CGI版と mod_perl版 の実行動作の違いについて |
|
前にも言いましたが mod_perl に於いてはスクリプトを実行可能状態にコンパイルしてメモリに保持
し続けるがまたそれと同時にスクリプト内で使われる変数に於いても同様の事が起こる。
これは一見なんの問題も無いように思えるがスクリプトの作り方次第では問題が起こることが多い。 実際にサンプルを使って検証してみる。 |
count.pl:
|
|
上のスクリプトは単にカウンタをインクリメントして表示するプログラムである。 これをCGIとして実行すると次の様な結果になる。 ※何度実行しても同じ答えが出るはず。 |
Count is 1
|
| 次に mod_perl 環境で実行するとどうなるだろうか、1度目は上と同じだが2度3度と繰り返すと 値がどんどん増えていってしまう。これでは明らかに目的とは違うスクリプトになってしまう。 |
Count is 6
|
|
これは CGI ではプログラムの終了をもって全てメモリがクリアされるのに対し、
mod_perl 環境に於いてはスクリプトと取得したメモリを保持し続ける事が原因である。 じゃ、どうすればいいんだい?と言われるがスクリプト内では変数を 必ず初期化して尚かつ変数のスコープを限定して利用すれば良いはずである。 さらに言うと use strict; を使い -w オプションを付けて実行しerrorログに何も出てこなければOKなはずだ。 |
因みに上記のスクリプトを実行すると error ログには次の様に記録される。
Variable "$count" will not stay shared at /home/ishot/public_html/count.pl line 13. |