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

以下のライブラリをインストールする。

テストで使用されるcmpコマンドは以下に含まれている。

Apacheの設定

WEBサーバはyaktyさんにパッケージ化して頂いているZaurus用Apache 1.3.33mod_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つのファイルをブラウザで開いて、動作確認をして見て欲しい。