実際のソースをみてみる。
・このサイトでも使っているカウンターの方式をこちらに紹介しますね。
(全文は書けないのでこのまま使っても動きそうな感じに書き換えてます)
もちろんPHPがインストールされ動作する環境のサーバー内に設置しないと動きません。
//-----------------------------------------------------------
【下記PHPの動作に必要なファイル】
1.yobidashi.php (名前はなんでもかまいません)
2.mod.inc
3.cnt.dat (サーバーに設置したら、属性を666にして下さい)
この3ファイルを同一階層に設置して、それぞれに下記を記述する。
//■FUNCTION呼出側・yobidashi.php■カウンター
require("mod.inc"); //mod.inc の呼出
$CONF[0]['GIP'] = "自分のグローバルIPアドレス"; //自分のIPアドレスを代入。
$CNT = T_CNT("cnt.dat",$REMOTE_ADDR,$CONF); //$CNTにカウンタ数値が入る。
//引数は(DATファイル,アクセス元のIP,自分のIP)
print "[".$CNT."]\n"; //カウンタ値の表示
//■FUNCTION・mod.inc■ TXTカウンター表示
function T_CNT($FILE,$REMO_ADDR,$CONF) //$CONF配列
{
$fp = fopen($FILE, "r+"); //ファイルを開く
if(!$fp) //ファイルを開けない時は$fpに'false'が入る。
{
$counter = "NG"; //ファイルを開けない時は数字の変わりにNGを代入。
}
else
{
set_file_buffer($fp, 0); //バッファを0にする。
flock($fp, 2); //ファイルをロックする。
rewind($fp); //ファイルポインタを文字の先頭に移動。
if($REMO_ADDR == $CONF[0]['GIP']) //$CONF[0]['GIP']は配列です。
{ $counter = fgets($fp, 10) + 0; } //自分のPCからのアクセスはカウントをあげない。
else
{ $counter = fgets($fp, 10) + 1; } //外部アクセスはカウントを1増やす。
rewind($fp); //ファイルポインタを文字の先頭に移動。
fputs($fp, $counter); //ファイルにカウンタ値を書込む。
flock($fp, 3); //ロックを解除。
fclose($fp); //ファイルを閉じる。
}
return $counter; //カウンター値を返す。
}
//-----------------------------------------------------------
■以上がソースコードです。
私の場合、自分のアクセスはカウントしないようにしています。
$CONF[0]['GIP'] に自分のグローバルIPアドレスが格納されています。
わざわざ配列にしているのは、自分のサイト情報やマシン情報、個人情報などを $CONF
に配列として入れておくと、後々必要になる情報をファンクションに渡すときに、パラメータ(引数)の数を
増やさなくてすむからです。
カウンタをファンクション化しているというのは、
このファンクションを何箇所からも共有で使っているということで、そうした場合、
もし、グローバルIPアドレスなどを『000.000.000.000』という形式で手打ちしていた場合、
変更があるたびに全ての呼出記述を変更しなければならなくなりますよね。
もし、10箇所でこのファンクションを呼び出して使ってた場合、その10箇所の記述が
どこだったかなんて覚えてられません。
そういった意味でも特定のデータを$CONF[0]['GIP'] のように配列で保持しておくと、大元の変更
だけで済むので便利です。
PHPカウンタの解説で、ファイルを開けない時、『カウンタをひらけません』と表示して、exit; している場合が
ありますが、これはちょっと問題です。なぜなら、もしカウンタファイルが開けない場合HTML書き出しの
処理が、exit; により終了してしまい、その後にある表示などの処理は一切行われないからです。
サイトにアクセスしている利用者からすればカウンタの数値など大きな問題ではないのですから、
『NG』と表示させたり、空白を表示し、次の処理を実行させる方がいいと思います。
|