のフリーCGI・PHPスクリプトをキーワード、97のカテゴリから検索できます。スクリプトの登録ご利用は一切無料です。


フリー、シェアCGI・PHPスクリプトをキーワード、96のカテゴリから検索できます。

 色々なスクリプトをお探しなら当サイトで検索

  •  フリーのCGI・PHPスクリプトだけをメインに掲載。
  •  ランキングによる評価で人気のスクリプトを紹介。
  •  サンプル(ページ)の閲覧によるダウンロード前の事前評価。
  •  お気に入りスクリプトへのパーソナルリンクの作成。

 スクリプト登録のメリット

  •  フリースクリプトなら一切無料で幾つでも掲載。
  •  細かなカテゴリ(全97項目)で閲覧者に分かり易く分類。
  •  スクリプトを印象づけるサンプル(ページ)の登録が可能。
  •  ダウンロードランキングの実施による人気度の評価。

素材サイト検索
- SPECIAL THANKS -

TOPページFlashを制作して頂きました
[ バナー作成ドットコム ]

簡易アクセスカウンター


アクセスカウンターを作るためには、データファイルの取り扱いを理解している必要があります。
また、ファイルのロックし、データの紛失を防ぐことも重要なポイントです。

#!/usr/bin/perl

# カウントデータ
$DATA_COUNT = 'count.dat';

# ファイルを読み込みモードで開く
open(DATA, "< $DATA_COUNT");
# ロック処理
eval{ flock(DATA, 1); };

# カウント数取得 と 前回のIPを取得
($count, $ip) = split(/\t/, <DATA>);

# カウントデータロック解除
close(DATA);

if($ENV{'REMOTE_ADDR'} ne $ip) {
# もし前回アクセス者のIPと今回のIPが違うなら
   # カウント値加算
   $count++;
   # IPアドレス入れ替え
   $ip = $ENV{'REMOTE_ADDR'};

   # ファイルを読み書きモードで開く もしくは、追加書き込みモードで開く
   open(DATA, "+< $DATA_COUNT") or open(DATA, ">> $DATA_COUNT");
   # ロック処理
   eval { flock(DATA, 2); };
   # ファイルポインタを先頭に設定
   seek(DATA, 0, 0);

   # データを書き込む
   print DATA "$count\t$ip";
   # ファイルサイズを適用する
   truncate(DATA, tell(DATA));

   # 閉じる
   close(DATA);
}

print "Content-type: text/html\n\n";

print $count;

まずはじめに、ファイルを開いてロックするわけですが、そこに複雑な命令があります。

eval { flock(DATA, 1); };

"flock(DATA, 1);"はファイルをロックする処理です。
これは、アクセスが重なり読み書きの重複で起きるデータの消失を防ぐ関数です。
しかし、このflock関数は優秀なのですが使えないサーバーが多々あるという最大の欠点があります。
もちろん、定義されていない関数を呼びたすと致命的なエラーによりプログラムは停止してしまいます。

これを防ぐのがeval関数です。
eval関数は、引数をスクリプトとして実行する機能があります。
さらに、致命的エラーが発生しても未定義値が返されるだけなのです。
このeval関数は、ブロック{ }を使うと実行効率が上がるため使用しています。
また、eval関数に渡すスクリプトは文字列でもいいため、

$LOCK = 'flock(DATA, 1);';

eval { $LOCK };

と表記しても実効されます。
エラーが起こりうる場合で、プログラムを停止させたくない場合や変数などに処理内容を記憶させ、
それを実行させるために使用します。

次に、取得したデータをカウントと、前回アクセス者のIPとを分割して取得しています。

もし、IPから判断して同一人物であるならそのままなんの処理も行わずにカウント数を出力させています。

IPが異なる場合は、カウント数を増やし、IPアドレスを更新し新たに情報をファイルへ書き込んでいます。

open(DATA "+< $DATA_COUNT") or open(DATA, ">> $DATA_COUNT");

ファイルを書き込む前の処理ですが、この式は左辺が成立しなければ(偽ならば)右辺を実行するとなっています。
したがって、読み書きモードでのオープンに失敗した場合は、追加書き込みモードでオープンする仕組みになっています。
読み書きモードでは、オープンできない場合もあるので必ず上記のようにします。

seek関数は、ファイルポインタを設定する関数で、ここではファイルの0バイトの位置(最初)にすることで
上書きと同等のことを行います。
truncate関数は、ファイルサイズを設定する関数で設定したバイト数が現在のバイト数よりも少ない場合は、
ファイルの末尾から削ります。
tell関数は、現在のファイルポインタの位置を返す関数なので"truncate(DATA, tell(DATA));"では、
書き込みを行った分以外を消去する処理となっています。

あとは、カウント数を出力するのみです。

sozaiCLUB