HTMLにPerlスクリプトを埋め込む
ePerl(Embedded Perl)は、JSP(JavaServer Pages)やeruby(Embedded Ruby)と同様に、HTMLにPerlスクリプトを埋め込み、それをWEBサーバー側で解釈した結果をWEBブラウザに提供する仕組み(SSI:Server Side Includes)である。
残念ながらePerlは、1998/8/2時点のバージョン2.2.14で開発が停止しており、対応するPerlのバージョンは5.3〜5.6である。
ここに掲載するePerlは、塚本さんにパッケージ化して頂いているZaurus用Perl 5.6.1向けにビルドしたものである。
ソースはここからダウンロードし、dev-img-1.3でセルフコンパイルした。
download:eperl_2.2.14-1_arm.ipk
ビルド環境
ePerlをZaurusでビルドするためにはパッチの適用、ライブラリやツールの準備が必要である。
差分ファイルによるパッチの適用
以下の差分ファイルを使用して、ソースファイルにパッチを当てる。
download:eperl-2.2.14_zaurus-diff.tar.gz
差分ファイルはconfigure用と、configureを実行した後に適用するものがある。
パッチを当てるためには、きむらさんにパッケージ化して頂いているpatchコマンドを使用することができる。
具体的には以下のようにコマンドを実行する。
$ patch configure < eperl-2.2.14.conf.diff $ ./configure $ patch < eperl-2.2.14.diff can't find file to patch at input line 2 Perhaps you should have used the -p or --strip option? The text leading up to this was: -------------------------- |diff -r eperl-2.2.14.orig/Makefile eperl-2.2.14/Makefile -------------------------- File to patch:※ : :
※上記のように「File to patch:」と言うプロンプトが表示されるので、その直ぐ上の「diff -r ...」を参考にパッチを当てるファイルのパスを入力する。
ライブラリとツールの準備
以下のライブラリのシンボリックリンクを作成する。
# ln -s /lib/libcrypt.so.1 /usr/lib/libcrypt.so # ln -s /lib/libdl.so.2 /usr/lib/libdl.so # ln -s /usr/lib/libperl.so.5.6 /usr/lib/libperl.so
以下のライブラリをインストールする。
- prudentialscatterbrainさんのlibgcc_3.4.4-1_arm.ipk
- Sohgetsuさんのlibgdbm_1.8.3-1_arm.ipk
テストで使用されるcmpコマンドは以下に含まれている。
Apacheの設定
WEBサーバはyaktyさんにパッケージ化して頂いているZaurus用Apache 1.3.33とmod_perl 1.29を使用した。
ePerlに関するApacheの設定は以下の通りである。
なお、同じ内容が "/home/www/conf/httpd.conf.eperl" に記述されている。
[mod_alias.c]の設定
"/home/www/cgi-bin/eperl" は "/usr/local/bin/eperl" へのシンボリックリンクである。
したがって、以降で説明する[mod_mime.c]の設定により、".phtml" ファイルに関連付けらてたeperlコマンドが、シンボリックリンクでも実行されるように以下のOptionsを設定する。
<IfModule mod_alias.c> <Directory "/home/www/cgi-bin"> # 既存の設定がNoneの場合 Options FollowSymlinks # それ以外の場合 Options <既存の設定>, FollowSymlinks </Directory> </IfModule>
[mod_mime.c]の設定
拡張子が ".phtml" のファイルがブラウザで開かれた場合、そのファイルがeperlコマンドによって解釈されるように以下のMIMEを設定する。
<IfModule mod_mime.c> AddType application/x-httpd-eperl .phtml Action application/x-httpd-eperl /cgi-bin/eperl </IfModule>
[mod_perl.c]の設定
拡張子が ".iphtml" のファイルがブラウザで開かれた場合、そのファイルがmod_perl上のApache::ePerlモジュールによって解釈されるように以下のPerlModuleを設定する。
mod_perl上で動作するePerlは、Apacheの起動と同時に本体のロードと初期化が行われ、ブラウザが ".iphtml" ファイルを開いた直後からそのファイルの解釈を開始する。
これに比べ、前述の ".phtml" ファイルをブラウザで開いた場合、eperlコマンドのロードと初期化が毎回行われる。
したがって、".iphtml" ファイルの方が ".phtml" ファイルよりも高速に表示することができる反面、メモリに常駐している分だけ、mod_perl上のePerlはメモリを消費する。
<IfModule mod_perl.c> PerlModule Apache::ePerl <Files *.iphtml> SetHandler perl-script PerlHandler Apache::ePerl </Files> </IfModule>
動作テスト
動作テストには以下の2つのファイルを "/home/www/htdocs" に作成する。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>date</title> </head> <body> <p><?= scalar(localtime) !></p> </body> </html>
(以上 test.phtml)
#include test.phtml
(以上 test.iphtml)
2つのファイルをブラウザで開いて、動作確認をして見て欲しい。