Webアプリ開発事始 第9回

CGIの仕組みを覗く(2)~ゲストブックの仕組みとプログラミング言語 長谷川裕行
有限会社 手國堂

ゲストブックの仕組み

CGIプログラムの例として、インターネットのWebサイトによくある「ゲストブック」の仕組みを紹介しておきましょう。


- メッセージを表示するだけ -

ゲストブックと似た機能に、BBS(Bulletin Board System:電子掲示板システム)があります。一般に、BBSはあるユーザーが書き込んだメッセージに対して、別のユーザーがその返信(俗に言う「レス」)を書き込む…といった形で、複数ユーザーによる討論や情報交換が可能なシステムです。

対してゲストブックは、ユーザーが単にメッセージを書き込むだけで、それに対して他のユーザーが返事を書き込むといった、ユーザー同士の相互のやり取りはありません。ユーザーの入力したメッセージは、時系列順にWebページに表示されるだけです。

そのため掲示板システムに比べれば、内部の仕組みは単純になります。また、ここで紹介するゲストブックのサンプルは、仕組みを理解していただくことが目的なので、さらにシンプルな仕様とします。

とは言っても、アクセスカウンタほど短くはなりません。


- 処理の概要 -

クライアントのブラウザに、図2のようにテキストボックスを1つ表示し、ユーザーはそこにメッセージを入力します。[送信]ボタンをクリックすればメッセージはWebサーバーへ送信され、[取消]ボタンをクリックすれば処理が取り消されます。

Webサーバーにメッセージが送信されると、CGIプログラムによってWebサーバー側のテキストファイルにメッセージが書き込まれ、さらにその内容がWebページに表示されます。

実際に使われるゲストブックのプログラムでは、ユーザーが扱いやすいようにいろいろな仕掛けを施します。そのため、非常に単純なシステムでも、プログラムのソースコードはかなり長くなります。

この記事ではプログラムのソースコードを理解していただくことが目的ではないので、ソースコード全体を紹介することは割愛します。

図2:シンプルなゲストブックの入力画面
図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:ゲストブックのデータの流れ
図3:ゲストブックのデータの流れ


リスト2:Perlによるゲストブックのソース


- 目次 -
CGIプログラムの基本構造
CGIのデータ受け渡し
ゲストブックの仕組み
メッセージを表示するだけ
処理の概要
入力画面のHTML
プログラムの処理手順
本当はもっと長く複雑になる
CGIの長所と短所
CGIとプログラミング言語
慣れた言語が一番
あとがき

Copyright © GrapeCity inc. All rights reserved.