SSIを使用したカウンタを作ってみることにしましょう。SSIでは、Webサーバーで実行されたスクリプトの結果がHTMLに組み込まれてクライアントに返されます。HTMLからの呼び出し
通常、SSIを呼び出すHTMLファイルの拡張子は shtml となります。また、スクリプトの拡張子は cgi か pl となります。カウンタの仕組み
SSIを使用してHTMLからカウンタスクリプトを呼び出すには次のようにします。
<!--#exec cmd="./cgi-bin/count.pl"-->
#exec cmd のあとにスクリプトへの相対パスを記述します。このパスはSSIを呼び出すHTMLファイルからみたスクリプトの位置となります。例えば・・・ index.shtml | |-- /cgi-bin/ |-- count.pl index.shtmlからcount.plを呼び出す場合、 <!--#exec cmd="./cgi-bin/count.pl"--> となります
アクセスカウンタの仕組みはとても簡単です。実際にスクリプトを記述してみる
↓
カウンタファイルを読み込む ↓
カウントする ↓
カウンタファイルを書き込む
HTMLファイルへ出力
では実際にスクリプトを記述してみましょう。ファイルのロック機構#!/usr/local/bin/perl $count_file = "./count.dat"; ##### カウンタファイルを読み込む open(READ, "$count_file") || exit; $count = <READ>; close(READ); ##### カウントする $count++; ##### カウンタファイルを書き込む open(WRITE, "> $count_file") || exit; print WRITE $count; close(WRITE); ##### HTMLファイルへ出力 foreach (0..length("$count")-1) { $img = substr($count, $_, 1); print "<IMG SRC=\"$img.gif\" ALT=\"$img\">"; } exit;上記のスクリプトは最もシンプルなグラフィカルアクセスカウンタのスクリプトです。カウンタデータは、同一ディレクトリ上にある count.dat としています。
複数のアクセスが集中することで、データファイルが同時にオープンされてデータファイルが破壊されることがあります。Webサーバーで書き込み処理を行うスクリプトではファイルロックは必須となります。
■ Perl5以降では・・・flock() 関数を使用することで、ファイルロックを行うことができます。■ では、Perl5より以前のPerlではどうすれば・・・?flock($count_file, 2); open(WRITE, "> $count_file") || exit; close(WRITE);ファイルをオープンする直前にファイルをロックし、ロック対象のファイルがクローズされた時点でロックが解除されます。
flock() 関数はPerl5より導入されたため、Perl4以前のバージョンでは使用することができません。このような場合、ロックファイルを作成してファイルの使用状態を監視します。
&file_lock; OPEN (FILE, "> $data_file") || exit; print FILE "abcde"; close(FILE); &file_unlock; ##### ロックサブルーチン sub file_lock { $retry = 3; while (-e $lock_file) { # ※1 ファイルテスト if ($retry == 0) { die "処理がタイムアウトになりました"; # ※2 } sleep 2; $retry--; } open (LOCK, "> $lock_file") || exit; close LOCK; } ##### ロック解除サブルーチン sub file_unlock { unlink $lock_file; #※3 }ファイルロックサブルーチンでは、ロックファイルを作成します。すでにロックファイルが存在する場合(※1)、ファイルは使用中ということになるので、ロックファイルが消去されるまで、リトライします。上記の例では、リトライ回数を3回に設定し、3回目のリトライでもファイルが使用中である場合、スクリプトはエラー終了します(※2)。
ファイルロックが正常に終了したら通常のファイル操作を行い、ロック解除サブルーチンでロックファイルを消去します(※3)。
●ロックファイルをスクリプトから作成する場合、ディレクトリのパーミッションが通常の[755]ではできません。[777]あたりにパーミッションを変更してください。