用途
PSGIアプリケーションは、環境変数を引数として使用してハッシュ参照を受け取り、応答を返す関数です。
リクエスト
アプリケーションに渡されるハッシュには、CGIのヘッダーの名前(REQUEST_METHOD、SCRIPT_NAME、QUERY_STRINGなど)に似た名前の変数と、HTTP要求からのヘッダー(HTTP_HOSTなどのHTTP_で始まる)が含まれます。 さらに、ハッシュにはPSGI固有の変数が含まれている必要があります。
- psgi.version:PSGIのバージョンを含む配列[1,0]への参照。
- psgi.url_scheme:リクエストに応じて、httpまたはhttps。
- psgi.input:入力ストリーム。
- psgi.errors:エラー出力用のストリーム。
- psgi.multithread:同じプロセスの別のスレッドでアプリケーションを呼び出すことができる場合はtrue。
- psgi.multiprocess:アプリケーションを別のプロセスで呼び出すことができる場合はtrue。
- psgi.run_once:プロセスが完了する前にアプリケーションが1回だけ呼び出されることが予想される(ただし保証されない)場合はtrue(通常、アプリケーションがCGIを介してサーバーに接続されている場合のみtrue)。
- psgi.nonblocking:アプリケーションがイベントループで呼び出される場合はtrue。
- psgi.streaming:サーバーが保留中の応答とストリーミングをサポートしている場合はtrue。
答え
一般に、アプリケーションは、応答HTTPコード、ヘッダー、応答本文の3つの要素の配列への参照を返す必要があります。 応答HTTPコードは少なくとも100の整数である必要があります。ヘッダーは配列への参照として送信され、Content-Typeヘッダーが存在する必要があります(応答1xx、204、または304を除く)。 応答の本文は、文字列の配列(または行ごとに分離しない応答全体)への参照、またはIO ::ハンドルのようなオブジェクトまたはファイル記述子です。 遅延応答が必要な場合、アプリケーションは、応答のコールバックが送信される関数を返すことができます。
応用例
これは最も単純なPSGIアプリケーションです。
sub { [ 200 , [ 'Content-Type' => 'text/plain' ] , [ 'Hi, ' . shift -> { REMOTE_ADDR } ] ] }
ミドルウェア
ミドルウェアは通常のアプリケーションに似ていますが、環境変数とPSGIアプリケーションの応答という2つの引数を取ります。 ミドルウェアを使用して、このデータを分析したり(通常のアクセスログのメンテナンスなど)、変更したりできます。 X-PSGI-Usedヘッダーを応答に追加するミドルウェアの例を次に示します。
my $app = sub { [ 200 , [ 'Content-Type' => 'text/plain' ] , [ 'Hi, ' . shift -> { REMOTE_ADDR } ] ] } <br/>
my $middleware = sub { <br/>
my $env = shift ; <br/>
my $res = $app -> ( $env ) ; <br/>
push @ { $res -> [ 1 ] } , 'X-PSGI-Used' => 1 ; <br/>
return $res ; <br/>
} ;
CPANのPlackには、 かなり多数の多様なミドルウェアがあります。
サーバー
サーバーはPSGIアプリケーションの起動を提供し、環境変数を使用してハッシュをコンパイルし、それをアプリケーションに転送し、応答を処理する必要があります。 現在、いくつかのPSGIサーバーがあります。
- Plackはミドルウェアとサーバーのコレクションであり、それらのほとんどは既存のPerlモジュールのラッパーです。 さらに、同じ名前空間には、CPANのPlackディストリビューションの構成に存在しないサーバーがいくつかあります: AnyEvent 、 FCGI :: EV 、 Danga :: Socket 、 Coro 、 POE、およびServerSimple 。 PlackでPSGIアプリケーションを実行するのは簡単です。
plackup --server Coro --port 9090 --host 127.0.0.1 test.psgi
- psgiサポート用のパッチを含むnginx
- Apacheのmod_psgi
- パーバル
- 他のサーバー
フレームワークのサポート
現在、すべての一般的なWebフレームワークでPSGIがサポートされています。Catalyst、 CGI :: Application 、 HTTP :: Engine 、 Dancer 、 Mason 、 Squatting 、 Continuity 、 Maypole 、 Tatsumaki
参照資料
PSGI / Plackウェブサイト
PSG CPAN仕様
PSGI :: FAQ
CPANのPlack