🐘

PHPでWebサイトのアクセスカウンタを作った

2024/08/07に公開

PHPで、Webサイトのアクセスカウンタを作成しました。

カウント数は、PHP経由でdatファイルに保存するプログラムです。

datファイルのパスを指定することで、簡単にアクセスカウンタが設置できます。

プログラムの概要

このプログラムは以下のような機能を持っています。

  • カウント数をdatファイルに保存する。
  • クッキーを利用して、一定期間内の再訪問を検知する。
  • ファイルロックを利用して、同時アクセスによるカウントの競合を防止する。

プログラムのコード

以下が、アクセスカウンタのPHPコードです。

<?php

// カウント数が記録されているファイルのパス
$file_path = 'count.dat';

// クッキーの名前
$cookie_name = 'page_viewed';
// クッキーの有効期限(秒)
$cookie_duration = 3600; // = 1時間

// カウントを保存するファイルが存在しない場合は作成
if (!file_exists($file_path)) {
    file_put_contents($file_path, '0');
}

// ファイルを排他ロックで開く
$fp = fopen($file_path, 'r+b');

// ファイルのロックに成功した場合のみ処理を続行
if ($fp !== false) {
    // ロックを取得
    if (flock($fp, LOCK_EX)) {
        // ファイルからカウント数を取得
        $count = (int)fgets($fp);

        // クッキーが設定されていない場合のみカウントを増やす
        if (!isset($_COOKIE[$cookie_name])) {
            // カウントをインクリメント
            $count++;
            // ファイルのポインタを先頭に戻してカウント数を書き込む
            rewind($fp);
            fwrite($fp, (string)$count);
            // クッキーを設定
            setcookie($cookie_name, '1', time() + $cookie_duration);
        }
        // ロックを解放
        flock($fp, LOCK_UN);
    }
    // ファイルを閉じる
    fclose($fp);
}

?>

<p>あなたは<?php echo $count; ?>人目の来訪者です。</p>

プログラムの詳細説明

ファイルの初期化

まず、カウント数を保存するためのファイルcount.datが存在しない場合に新しく作成するようにします。初期値は0に設定します。

if (!file_exists($file_path)) {
    file_put_contents($file_path, '0');
}

ファイルの排他ロック

次に、count.datファイルを排他ロックで開きます。複数の訪問者が同時にアクセスした場合に、データの競合を防ぐための処理です。

$fp = fopen($file_path, 'r+b');

if ($fp !== false) {
    if (flock($fp, LOCK_EX)) {

カウントの更新

ファイルから現在のカウント数を取得し、クッキーが設定されていない場合に、カウントをインクリメントします。そして、カウント数をファイルに書き戻します。

$count = (int)fgets($fp);

if (!isset($_COOKIE[$cookie_name])) {
    $count++;
    rewind($fp);
    fwrite($fp, (string)$count);
    setcookie($cookie_name, '1', time() + $cookie_duration);
}

結果の表示

最後に、HTMLで表示します。

?>

<p>あなたは<?php echo $count; ?>人目の来訪者です。</p>

アクセスカウンタ

作ったアクセスカウンタです。
アクセスカウンタ

まとめ

訪問者数を正確にカウントするために、ファイルの排他ロックやクッキーを活用しました。
シンプルな実装ですが、趣味でのちょっとしたアクセスカウンタとして、簡単に設置できます。

Discussion