概要
PHPのビルトインサーバを使っていたが、環境変数を外から設定することができない。
FUEL_ENVを設定してモードを切り替えが気軽にできないので不便だった。
ビルトインサーバを書き換えるのは難易度が高そうだったので、
Plack上で動かすことで環境変数を設定できるようにした。
Plackで動かすためのスクリプト
スクリプトは以下のようになる。
app.psgi
use Plack::App::CGIBin;
use Plack::App::PHPCGI;
use Plack::Builder;
use File::Zglob;
my $DOCROOT = 'public';
my $php_cgi = '';
$php_cgi ||= `which php-cgi`;
chomp($php_cgi);
my $static = Plack::App::File->new(root => $DOCROOT)->to_app;
my @php;
for my $php ( zglob("$DOCROOT/*.php") ) {
my $mount = $php;
$mount =~ s!^$DOCROOT!!;
my $app = Plack::App::PHPCGI->new(
script => $php,
php_cgi => $php_cgi,
)->to_app;
push @php, [$mount,$app];
}
builder {
enable 'ReverseProxy';
enable sub {
my $app = shift;
sub {
my $env = shift;
$env->{REMOTE_USER} = 'php';
$env->{PATH_INFO} = '/' . 'index.php/' . $1
if $env->{PATH_INFO} =~ m|^/([^\.]+)*$|;
$env->{FUEL_ENV} = $ENV{FUEL_ENV} || 'development';
$app->($env);
};
};
for my $php ( @php ) {
mount $php->[0], $php->[1];
}
mount '/' => $static,
};
サーバの起動は以下のように行う。
$ plackup app.psgi # developmentモード
$ FUEL_ENV=production plackup app.psgi # productionモード
コマンド上で変数を設定することによって、モードが切り替えられるようになった。
内部的にはphp-cgiを使っているので、CGIモードで動いているのと同等になっている。
このスクリプトを動かすためのcpanfileは、以下のようになっている。
cpanfile
requires 'Plack';
requires 'Plack::App::CGIBin';
requires 'Plack::App::PHPCGI';
requires 'File::Zglob';
requires 'CGI::Compile';
requires 'Plack::Middleware::ReverseProxy';
参考
Plack上でPHP(php-cgi)を動かす
http://blog.nomadscafe.jp/2012/12/plackphpphp-cgi.html