LoginSignup
4
4

More than 5 years have passed since last update.

FuelPHPのアプリをPlack上で動作させる

Posted at

概要

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4