2006 年 9 月 1 日 18 時 25 分

フォームを処理するのは誰か


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


フォームは汎用的なものであるため、
開発プラットフォームとして利用しやすい。
そのため、フォームを使う Web サイトは一気に増加した。

さて、フォームが HTTP で送信される様子は見てきたが、
では、Web サーバはフォームのデータを受け取った後、
どのような処理を行うのであろうか。

HTTP では、フォームを送信する方法に関する規定はあるが、
フォームの用途は特に規定されていない。
また、フォームは HTML の製作者が自由に定義できるため、
当然ながら、その用途は製作者しか知らない。

つまり、Web サーバがフォームを受け取っても、
それをどのように扱えばいいのか分からないのだ。
Web サーバにできるのは、要求があった URL に対応する
ファイルを探し出し、それを送り返す程度なのだ。

1 つの方法として、独自のフォーム処理機構を開発し、
それを Web サーバに追加することはできる。

例えば、blog や掲示板専用の Web サーバであれば、
処理速度を向上させるために Web サーバに
フォーム処理機能を実装するようなことは考えられるが、
それは用途が限定されるケースの話だ。

一般的には、フォームの修正や追加が行われるたびに、
いちいち Web サーバの修正が必要になるので現実的でない。

それに、1 台の Web サーバで、何人もの
コンテンツ製作者の Web サイトを処理する事もあるので、
それらフォームに対応しているときりがない。

そこで、初期の Web サーバの 1 つである
NCSA httpd は、CGI と呼ばれる考え方を導入した。

CGI は、Common Gateway Interface の略称である。
共通入出力仕様とでも訳しようか。
これは、簡単に言うと Web サーバを窓口として、
プログラムを実行する仕組みだ。

CGI に関しては、NCSA httpd のページに仕様書がある。
CGI の現在のバージョンは、1.1 となっており、
最近、参考情報として RFC 3875 としても公開された。

■ The Common Gateway Interface
http://hoohoo.ncsa.uiuc.edu/cgi/

■ The Common Gateway Interface (CGI) Version 1.1
http://www.ietf.org/rfc/rfc3875

NCSA httpd は、特定の URL への要求があると、
受け取ったリクエストのヘッダ行を解析した後、
それらを環境変数(実行環境に関する情報)に設定した上で、
URL に対応する外部のプログラムを実行する。

起動された外部のプログラムは、環境変数の値を元に、
データの更新や検索などの処理を行い、
リクエストに対するレスポンスとして送り返す、
HTTP ヘッダや本体の内容を標準出力に書き出す。
これは、HTTP の流儀に従っていれば、
別に HTML だけでなく、画像などでも構わない。

Web サーバは標準出力のデータを解析し、
それに必要な処理を施した上で、クライアントに送り返す。

この機能によって、Web サーバと、処理プログラムを、
個別にメンテナンスすることが可能になるのだ。

CGI は、Web サーバとプログラムの
データの受け渡しを方法を規格化したものであり、
CGI 自体はプログラム言語ではない。

CGI の規格によって起動可能なプログラムであれば、
それはどんな言語で書かれていても構わないのだ。
環境変数を理解し、標準入出力を利用できる言語なら、
それは CGI プログラムとして利用できることになる。

Web サーバが許すのであれば、
C 言語で書いて make したバイナリを置くこともできるが、
一般的に使われているのはスクリプト言語である Perl だ。

UNIX (のシェル)には、shebang という仕組みがあり、
スクリプト言語のソーステキストファイルであっても、
先頭行に処理系のパスを記述して実行ビットを立てれば、
実行可能なバイナリプログラムと同等に利用できる。

スクリプト言語であれば、ソースファイルのままで、
頻繁に修正や動作検証ができるため開発効率が高い。
そのため、UNIX での普及率も高く、
テキスト処理に向いている Perl が多く利用されている。

実際、mixi でも Perl が使われている可能性が高い。
pl という拡張子は、Perl のソースである事が多いからだ。
(設定次第で拡張子は変えられるので、推測でしかないが)

蛇足ながら、Windows でも Apache を使う場合、
ScriptInterpreterSource ディレクティブを使えば、
CGI として、好きな言語を使うことが可能だ。
例えば、WSH を使うように設定してやれば、
VBScript や J(ava)Script で CGI を書くこともできる。

CGI の用途は、フォーム処理に限らない。
Web サーバへのリクエストをほぼそのまま処理できるので、
Web サイト上で色々な処理を行わせることが可能となる。

CGI は、PHP や ASP、JSP などの
新しい仕組みが生まれるまでは、
Web サーバを使うシステムに必須の技術であったのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.