CGIプログラムの例として、インターネットのWebサイトによくある「ゲストブック」の仕組みを紹介しておきましょう。
- メッセージを表示するだけ -
ゲストブックと似た機能に、BBS(Bulletin Board System:電子掲示板システム)があります。一般に、BBSはあるユーザーが書き込んだメッセージに対して、別のユーザーがその返信(俗に言う「レス」)を書き込む…といった形で、複数ユーザーによる討論や情報交換が可能なシステムです。
対してゲストブックは、ユーザーが単にメッセージを書き込むだけで、それに対して他のユーザーが返事を書き込むといった、ユーザー同士の相互のやり取りはありません。ユーザーの入力したメッセージは、時系列順にWebページに表示されるだけです。
そのため掲示板システムに比べれば、内部の仕組みは単純になります。また、ここで紹介するゲストブックのサンプルは、仕組みを理解していただくことが目的なので、さらにシンプルな仕様とします。
とは言っても、アクセスカウンタほど短くはなりません。
- 処理の概要 -
クライアントのブラウザに、図2のようにテキストボックスを1つ表示し、ユーザーはそこにメッセージを入力します。[送信]ボタンをクリックすればメッセージはWebサーバーへ送信され、[取消]ボタンをクリックすれば処理が取り消されます。
Webサーバーにメッセージが送信されると、CGIプログラムによってWebサーバー側のテキストファイルにメッセージが書き込まれ、さらにその内容がWebページに表示されます。
実際に使われるゲストブックのプログラムでは、ユーザーが扱いやすいようにいろいろな仕掛けを施します。そのため、非常に単純なシステムでも、プログラムのソースコードはかなり長くなります。
この記事ではプログラムのソースコードを理解していただくことが目的ではないので、ソースコード全体を紹介することは割愛します。
図2:シンプルなゲストブックの入力画面
- 入力画面のHTML -
先述したように、ユーザーがメッセージを入力するための画面とCGIプログラムの起動とを、FORMタグを使ってHTMLファイルに記述します。テキストボックス1個と[送信][取消]のコマンドボタンを表示し、“gbk.cgi”というプログラムを起動するものとします。そのためのHTMLファイルの内容は、リスト1のようになるでしょう。
リスト1のHTMLを簡単に解説しておきます。
テキストボックスは、以下の1行で表示させています。
<INPUT type="text" size="40" name="msg">
サイズは40バイト分とし、名前は“msg”としています。
テキストボックスに入力された文字列は、[送信]ボタンのクリックでWebサーバーへ送信されます。以下の1行で[送信]ボタンを表示させています。
<INPUT type="submit" value="送信">
[取消]ボタンをクリックしたら、テキストボックスに入力された文字列が消去され、メッセージは送信されません。
<INPUT type="reset" value="取消">
[送信]ボタンがクリックされると、テキストボックスの内容がWebサーバーのCGIプログラム“gbk.cgi”に渡され、処理が行われます。
<FORM method="post" action="gbk.cgi">
「method="post"」としているので、テキストボックスの文字列は標準入力でgbk.cgiに送られます。
リスト1:CGIを使ったゲストブックのためのHTMLファイル
- プログラムの処理手順 -
ゲストブックでは、ユーザーが書き込んだメッセージをテキストファイルに保存しなければなりません。
書き込まれた内容を表示する場合は、そのテキストファイルの内容をCGIプログラムが読み込み、HTML形式のデータとしてWebサーバーへ送ります。
ユーザーが書き込んだメッセージを処理する場合、CGIプログラムでは以下のような手順が必要です。
(1) |
入力された文字列を受け取る |
(2) |
受け取った文字列を、テキストファイルの最後尾に書き込む |
(3) |
テキストファイルの内容をHTML形式に変換する |
(4) |
テキストファイルの内容を標準出力に送る |
(3)と(4)は、先に説明した「内容を表示するだけ」の場合と同じ処理になります。つまりユーザーがメッセージを書き込んだ場合は、その内容を一旦テキストファイルに追記してから、テキストファイルの内容を表示する――ということになります。
- 本当はもっと長く複雑になる -
それなりに使いやすいゲストブックとするなら、今説明した仕組みだけでは不十分です。
書き込みが増えていくと、テキストファイルのサイズがどんどん増え、内容を表示するWebページも長くなっていきます。当然、Webサーバーからクライアントへは、膨大なHTMLデータが送信されることになるでしょう。
これを避けるためには、ファイルに記録できるメッセージの件数を予め決めておき、決めた件数を超えたら、古いメッセージから順に削除する必要があります。また、Webページに表示するメッセージの件数も決めておき、上限を超えれば次のページへ送る――という処理も必要でしょう。
そうなると、保存件数の計算、表示するページの計算、複数ページとなった場合にページを前後移動するためのリンクなどなど、様々な処理を付け加えなければならなくなります。
このように、本来の機能である「メッセージを受け取って表示する」という処理以外のところで、かなりの手間がかかります。データの流れを、図で確認してください。
参考までに、perlを使ったゲストブックのソースをリスト2に掲載しておきます。非常に簡略化し、さらに不要な処理を省略しているため、このソースだけでは正常に機能しません。実際に機能するものにしようと思えば、この倍くらいのソースになるでしょう。
図3:ゲストブックのデータの流れ
リスト2:Perlによるゲストブックのソース
|
|
|