▼4-1 カウンターの基本は? |
カウンターの基本は、「3-4 ファイル入出力」でやった通りです。 一応、これでアップロードすればカウンターとして機能します。…が、これじゃちょっと寂しいですね。 これをもう少し改造して、機能をつけましょう。ただ、これから説明しやすいようにプログラムを少し変えます。
前回は読み込みと書き込みで2回ファイルを開いたけど、こうすれば1回で済みます。 ただしこの場合、書き込む前に seek( FILE, 0, 0 ); をつけて、ファイルの先頭を指してあげます。これを忘れると、上書きしてくれません。 |
▼4-2 ファイルのロック |
上のままでは、複数の人が同時に入ってきた時にうまくカウントしてくれません。 ちゃんと番号をカウントアップするためには、書き込みの時にファイルをロックする必要があります。 下がそのサンプルです。追加した部分は赤色で示してあります。
どうやら、Win(NTは除く)およびMacでは使えないみたいですが…すいません、まだ詳しくは分かりません。m(_ _)m |
▼4-3 SSIを使って表示しよう |
カウンターは、普通HTMLに組み込んで使います。
…が、このままではCGIにアクセスしないとカウンターとして機能しませんね。 そこで使うのがSSIです。SSIは、HTMLにCGIの実行結果を埋め込むときに使います。 SSIには「#include方式」と「#exec方式」という2つの方式がありますが、ここでは「#include方式」を使います。 この方式では、HTMLのカウンターを表示したい位置に <!--#include virtual="CGIファイル名" --> と書きます。するとサーバはそのCGIを実行し、その結果を置き換えてくれます。
ただSSIで使うということは、<HTML>、</HTML>はすでに存在しているので削除しておきましょう。
SSIが使えるファイルの拡張子を何にするかはWebサーバ側の設定になります。 一般にxxx.htmlの他にxxx.shtmlがあります。 |
▼4-4 gif画像を使おう |
「テキストのカウンターじゃ寂しい!」なんて人もいるでしょう。
というわけで、表示にgif画像を使ってみましょう。 まず、1から9の画像を用意して、「1.gif、2.gif…」のように名前を付けます。 それを、CGIと同じフォルダに放り込んどきましょう。次に、CGIファイルは下のような感じです。
では、カウントを「$out」という変数に保管します。「sprintf」は文字列を返却($outに設定)するという意味です。 $out =~ s/( . )/<IMG src=".\/$1.gif">/g; の説明は後回しにします。ってか、自分でも理解してない…(汗); |
▼4-5 Today、Yesterdayを表示しよう |
ネットサーフィンをしていると、よく総カウントの他に今日と昨日のカウントを
表示しているカウンターがありますよね。 実はこのカウンター、3-5で出てきたsplitを使えば作れちゃうんです♪ さっそく行ってみましょ〜 (Kentさんのdaycountを参考にしています)
では、データを(カウント、今日のカウント、昨日のカウント、日付)に分解しています。 ここで、$dayは「前回のカウントの時の日付」を指しているのがポイントです。 if ($day eq "$mday") { $today++; } 前回と今回の日付が同じ時には、Todayのカウントを1アップさせます。 else { $yesterday = $today; $today = 1; } そうでない場合は、日付が変わったということなので、Todayは昨日のカウントになります。 そして、代わりにToday = 1と設定してあげましょう♪ |
▼4-6 IPチェックをしよう |
例えば、トップページとメインページにカウンターを置いたとします。 すると、トップページで1カウント、メインページでも1カウント刻むことになってしまいます。 そこで、同じIPアドレスが連続した場合にはカウントしないように設定しましょう。
他にも$ENV{ 環境変数名 }を使えば、いろいろな情報を入手できます。
例えばリモートホスト名を記録しておけば、どのカウントを誰が踏んだか、ある程度分かります。 また、CGIが呼び出される前に参照していたページのURLを記録しておけば、自分のページがどこからリンクを張られているか分かっちゃいます。 |
▼4-7 まとめると… |
「4−2」〜「4−6」の機能を1つにまとめると、下のようになります。 よくあるフリーのCGIのように、設定は全部手前に持ってきました。
上にも書いたように、flockが最もロックファイルに適しているのですが、環境によっては使えないという問題があるからです。 そこで、フリーで配布されているCGIでは、他のロック処理が使われています。(その種類についてはまた・・・) |