tokuhirom's Blog

PSGIとPlackと 〜 軽量フレームワークAmon2入門 (3) 〜

さて、今回は裏をかいて、いったん本題のAmon2の話からはずれて、PSGI/Plackのはなしをしましょうかね。
PSGI/Plackは基本的にはアプリを書く人は知る必要はあまりないのですが、概念ぐらいは知っておくにこしたことはない、というところです。
さて、数年前のYAPCでわたくしが口を酸っぱくして申し上げたことを皆さんはおぼえているでしょうか。そう、一番大事なのは「PSGIは仕様。Plackは実装」ということなのでした。ここだけ把握していれば十分なので、PSGI/Plack の詳細に興味がない人はブラウザの Back ボタンを連打してください。

PSGIってなんだ?

PSGIとは「ウェブアプリケーションとアプリケーションサーバーの間のプロトコルのこと」です。Perlの基本的なデータ型であるArrayRef, HashRef やCodeRefを使ってHTTPリクエストとレスポンスを表現し、抽象化をおこないます。
やりとりは以下のような形でおこなわれます。

リクエストは HashRef(ハッシュリファレンス) に抽象化され、レスポンスは ArrayRef(配列リファレンス)に抽象化されます。これらのデータタイプは Perl の基本的なデータ構造です。PSGI は Perl の基本的なデータ構造のみに依存しているので、誰でも Pure Perl で実装することができるのです。ここが最大の特徴となっているのです。

PSGI 対応のウェブアプリ、ウェブサーバーは、それぞれ PSGI という抽象化レイヤをはさむことによりくみあわせをかんがえる必要がなくなります。

Catalyst や Sledge などの PSGI 以前のフレームワークでは、それぞれ、mod_perl 用のコードやら CGI 用のコードやらを実装していましたが、現在では PSGI に対応させさえすればいいのでフレームワークが非常に簡潔に記述できるようになりました。また、PSGI に対応していれば、PSGI 用のミドルウェアやテスト用のライブラリを利用することができ、周辺コードも大幅にへらすことができるのです。

現状、FCGI, mod_perl, CGI, Starman, Starlet など、あらゆるプラットホームで PSGI アプリケーションをうごかすことができます。またフレームワークなどもほぼすべてが PSGI をサポートしています。

このような状況によって、雨後の筍のように PSGI に対応したフレームワークがリリースされました。これはフレームワークの開発が容易になったからで、これは僕が想定していたとおりの流れです。一方で、フレームワークはつくるのは簡単なのですがドキュメントをそろえることや、継続的なメンテナンスなどをかんがえると、なかなか面倒になってきます。ですから PSGI をやるにあたって僕が考えていたのは「いったんフレームワークの数がすごい増えるが、その後収束していく」という状況でした。実際、そのような状況になりつつあるかとおもいます。

PSGI そのものにかんする詳細はPSGI.podを参照してください。

Plack

Plackとは、PSGIでウェブアプリケーションをかく時にその手助けとなるライブラリ群です。いわゆるリファレンス実装のようなものだとかんがえればよいでしょう。
Plackの中には、HTTPサーバー、各種ミドルウェア、リクエストオブジェクト、レスポンスオブジェクト、テストライブラリなどがふくまれます。PSGIなウェブアプリケーションをかくときには、Plackのコアディストリビューションになにが含まれているかを確認しておくとよいでしょう。

しかし、PSGI でアプリをかく場合、かならずしも Plack をつかう必要があるわけではないということに注意してください。たとえば evpsgi という libevent ベースの http サーバーは PSGI アプリケーションを実行することができますがこのサーバー自体は Plack に依存していません。

plackupコマンド

Plackにはplackupコマンドがついてきます。これは、app.psgiをサーバーで起動するためのコマンドです。
例えば以下のように起動します。
% plackup app.psgi
あとは http://localhost:5000/ にアクセスすればいいだけ。簡単でしょ?

plackup -R
  • R オプションを利用すると、アプリケーションを書き換えたタイミングで自動的にさいきどう することが可能となります。

なお、linuxで利用するばあい、Linux::Inotify2 というライブラリを入れておかないとパフォーマンスが劣化することに注意してください。

HTTP::Engine と Plack

HTTP::Engine というライブラリが過去にありましたが、PSGI/Plack は HTTP::Engine の後継者となっております。HTTP::Engine は二階の窓から捨てさられており、「ああ、そんなものもあったね」というレベルになっています。
もともと HTTP::Engine は Catalyst::Engine という Catalyst のサーバー抽象化部分をライブラリとしてきりだしたものです。

これも一定の成果はおさめたのですが、PSGI/Plack とちがいプロトコルというレベルのものを構築しなかったので、既存のフレームワークにとりいれづらかったという点があり、そこを解消するためにうまれたのが PSGI だったということです。

まとめ

さて、チュートリアルにいくとみせかけておいてから PSGI の話をさきにすませてしまいました。明日こそはチュートリアルにはいらなくてはですね。