同一クライアントの連続カウントを禁止する

メモ:  Category:php

同一クライアントの連続カウントを禁止するのにクライアントのIPアドレスを使用します。

ホームページにアクセスされた際、クライアントのIPアドレスと訪問時間をファイルに記録していきます。最初の訪問時間と2度目の訪問時間を比較し、一定時間経過していない場合カウントしないようにします。

それでは、クライアントのIPアドレスの取得方法です。これは、フォーラムを作成する際にも使用しました。

function GetClientIP(){
    if(empty($_ENV['REMOTE_ADDR'])){
        if(empty($_SERVER['REMOTE_ADDR'])){
            $client_ip = "";
        }
        else{
            $client_ip = $_SERVER['REMOTE_ADDR'];
        }
    }
    else{
        $client_ip = $_ENV['REMOTE_ADDR'];
    }
    return $client_ip;
}
//又は
$client_ip = getenv('REMOTE_ADDR');

次に訪問したときのアドレスと時間を記録し、一定時間内に以前訪問しているかをチェックします。

    function checkip(){
        if (file_exists($this->iplog_file)){
            $iplist = file($this->iplog_file);
        }
        $fp = @fopen($this->iplog_file,"w");
        $bRepeat = false;
        $clientip = $this->GetClientIP();
        if(isset($iplist)){
            foreach ($iplist as $ipdata){
                list($ip,$time) = explode("\t",$ipdata);
                if((time() - $time) < $this->ip_time){
                    if($ip == $clientip){
                        $bRepeat = true;
                    }
                    fputs($fp,"$ip\t$time");
                }
            }
        }
        if(!$bRepeat){
            $time = time();
            fputs($fp,"$clientip\t$time\n");
        }

        fclose($fp);
        return $bRepeat;
    }

まず、訪問してきたクライアントのアドレスと時間を記録するファイルが存在しているかを確認します。

存在していれば、 file() 関数でデータを読み込みます。

この file() 関数は、ファイルの内容を行ごとに配列に読み込んでくれる関数です。便利なことに、ファイルのオープンもクローズも必要ありません。

訪問記録用にファイルをオープンします。

先ほど紹介した、クライアントのIPアドレス取得関数をコールします。

file() 関数で取得した配列を順に確認していきます。ただし、この配列の要素の中身は、IPアドレスと時間が一連の文字列となっているので explode() 関数で分解しています。

後は、現在の時間と記録されている時間を比較し、一定時間以上過ぎていれば記録されているデータを破棄します。

また、記録されているIPアドレスと今回訪問のIPアドレスが同一で一定時間経過していない場合は、「一致したよ!」ということで戻り値に true を返すようにしています。

後は、新規の場合や記録されていなかったときにデータを記録して終了です。

bluenote by BBB