mod_perl配下でPHPを実行する

すごいニッチな条件だけど。mod_perlで動かしてるCatalystアプリケーション配下で、レガシーなシステムのPHPファイルを持ってきて共存させることになった。Perlでロジックを書き直すのがベストなんだろうけど、時間無いのとメンドくさいのでできればそのままPHPを流用したい状況と思ってください。

とりあえずrootフォルダ配下に置いてみたけど、PHPインタプリタは実行されなかった。Apacheのハンドラがmodperlなのが原因かと思って、特定のパスだけdefault-handlerを適用するようにしてみたけど、その配下でもなぜか実行されない。。

仕方なく超アドホックにControllerに

my $body = `/usr/bin/php -f hoge.php`;
$c->res->body($body);

と書いて済まそうかと思ったけど、念の為CPANモジュールを検索してみたらちょうどいいのがありました。その名もPHP::Interpreter

こんな感じにPHPファイルを実行できて、しかもPerlのオブジェクトをPHPテンプレートに渡せるらしい。

my $p = PHP::Interpreter->new();
$p->include("hoge.php");

さらに素晴らしいことにCatalystのViewにもポートされていた(Catalyst::View::PHP)。Controllerにこんな感じで書ける。

$c->stash->{template} = 'hoge.php';
$c->forward($c->view('PHP'));

version0.01だしとりあえず作った感丸出しのモジュールだけど。。要件は満たせたから良しとしよう。

ちなみにうちの環境ではcpanコマンドからPHP::Interpreterをそのままインストールすることができませんでした。
Makefile.PLを見てみると

my $phpdir = shift @ARGV || ($^O eq 'MSWin32' ? 'C:\\php' : '/usr/local');

print "using phpdir $phpdir\n";

my $phpconfig = catfile $phpdir, 'bin', 'php-config';

とか書いてあって、/usr/local/bin配下にPHPがインストールされてることが前提になってる。。
うちの環境は/usr/bin/にあるのでこれまたアドホックにこの箇所を変更して

$ perl Makefile.PL
$ make
$ make install

でインストールできた。あとREADMEによるとPHPのバージョンは5.0.xか5.1.xで、configure時に--enable-embedオプションをつけておく必要があるようです。