Webアプリ開発事始 第8回

CGIの仕組みを覗く(1)~基本原理とSSIによるアクセスカウンタ 長谷川裕行
有限会社 手國堂

アクセスカウンタの仕組み

SSIの例として、アクセスカウンタの原理を紹介しておきましょう。C言語を使ったプログラムです。動作の仕組みを把握していただくことが目的なので、C言語の文法やプログラミング技術については割愛します。


- 基本は件数の累計処理 -

アクセスカウンタとは、概念上はWebサイトを訪れた人の数を表示するものですが、実際には、特定のWebページ(多くはトップページ)のアクセス件数(ヒット数)を累計し、その数値を表示する機能となります。

多くの場合、アクセス件数を示す数字にはグラフィックスが使われますが、元になるアクセス件数(それまでにアクセスされた回数)は単なる整数値です。グラフィックスを使ったカウンタの画面は、単にその数値を画像データに置き換えているに過ぎません。この部分の処理についての説明は、ここでは本質的な問題ではないので省略します。

本質的な部分は、アクセス件数を数える処理です。その処理には、多くの場合C言語やPerlなどによるCGIやSSIが使われます。


画面1:画像を使ったアクセスカウンタ



- 累計を記録したファイルを書き換える -

アクセス件数を表示するには、それまでのアクセス件数の累計をファイルに記録しておき、アクセスされるたびに、その値を書き換えていきます。仕組みは、以下のようになっています。

(1) Webサーバー側にアクセス件数を記録するファイルを用意する
最初はデータとして“0”が記録されています。
(2) クライアントのブラウザがWebページにアクセスする
(3) WebページからCGIを通じてプログラムが実行される
(4) プログラムはファイルからデータを読み出し、それに“1”を加えた値を出力する
出力した値が、アクセスしたユーザー(HTMLファイルを読み込んだクライアント)に対する“アクセス件数”となります。
(5) 出力した値をファイルに記録する
これが最初のアクセスなら、この時点でファイルに内容は“1”に、36件目のアクセスならファイルの内容は“36”に書き換えられます。

画像を使って数値を表示する場合は、上記(4)のところで、出力する数値の各桁の値に対応する画像(0~9までの数値をデザインした画像ファイル)を並べて表示します。


- C言語で書いたプログラム -

上記の原理に基づいた、シンプルなアクセスカウンタのソースコードを紹介しておきます。言語はC言語で、画像を使わず、テキストで件数を表示するだけの仕様です。

アクセス件数を記録するファイルは“count.dat”という名前です。

リスト1:C言語によるアクセスカウンタ(UNIX版)

★印の箇所は、同時アクセスに対するカバーを行っている部分です。Webでは、1つのページが同時に複数のユーザーからアクセスされる場合があります。Webサーバーはアクセスされる都度CGI経由でプログラムを起動するため、同じプログラムが複数起動されます。すると、1つのファイルを複数のプログラムが同時にアクセスしてエラーとなり、正しい件数が記録できなくなります。

そこで、同時アクセスが発生し、ファイルを他のユーザーがオープンしている場合には、それがアクセスできる状態となるまで待機させます。

  for( i=0; i<5; i++) {

という行は、VBでは“For i =0 to 5 (Step 1)”と同じ意味で、{ }内の処理を5回繰り返すことを意味します。

UNIXでは、ファイルの実体に対してそれを間接的にアクセスするための“シンボリックリンク”というファイルを利用できます。{ }内では、このシンボリックリンクを新たに作成します。シンボリックリンクの作成は、リンク先であるファイルの実体を他のユーザーがオープンしているとエラーになるため、その場合は“sleep(5)”の箇所で5秒間待って、再度同じ処理を実行します。

それ以降、ファイルを開くことができればデータ(直前のアクセス回数)を読み出し、それに1を加えてファイルに書き込みます。さらに、同じ値を標準出力に送って処理は終了します。


- HTML内で実行を指示する -

上記のプログラムをコンパイルして“count”という名前で保存したとします。このプログラムをWebサーバーに実行させるには、リスト2のようなHTMLファイルを作成します。

クライアントがWebサーバーにアクセスし、このHTMLファイルを読み込む要求を送ると、Webサーバーの側でプログラム“count”が実行されます。実行結果はHTMLデータとしてクライアントに送られ、ブラウザにアクセス件数が表示されます。

この処理はSSIを利用して実行されます。プログラム“count”は、単にアクセス件数を示す数値(数字で構成された文字列)を出力するだけです。

先述したように、SSIではHTMLファイルが読み出されたときにプログラムが実行されます。プログラムの実行結果(アクセス件数)は、HTMLファイル内でSSIによるプログラムの実行を指示している箇所

  <!--#exec cmd="./counter"-->

に表示されます。

リスト2:アクセスカウンタのプログラムを実行するHTMLファイル


図6:アクセスカウンタの原理



あとがき

CGIの基本的な原理と、SSIを利用したアクセスカウンタの仕組みを紹介しました。どちらも、サーバーで実行したプログラムの結果を、HTMLデータとしてクライアントに送信する機能で、サーバーサイド・Webアプリケーションの基本と言えます。

ユーザーからの入力を受け取って処理できるCGIでは、SSI以上に細やかで複雑な処理が作れます。次回は、ユーザーからの入力を処理するCGIの例として、ゲストブックの仕組みを紹介します。


- 目次 -
CGIの基本原理
標準入力と標準出力
入出力の切り替え
CGIとSSI
アクセスカウンタの仕組み
基本は件数の累計処理
累計を記録したファイルを書き換える
C言語で書いたプログラム
HTML内で実行を指示する
あとがき

Copyright © GrapeCity inc. All rights reserved.