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オプションをつけておく必要があるようです。