アクセスカウンターはSQLiteとPHP言語で出来ています.

2025年12月19日
文字数[2698文字] この記事は3分22秒で読めます.

おはようございます、このサイトのアクセスカウンターはSQLiteとPHP言語で出来ています.ボット訪問者はカウントしないなどは別のプログラムで制御しています.そういう訳もあって結構シンプルなコードで出来上がっていると思います.この頃は海外からの訪問者も増えてきています.とくに中国とシンガポール経由の訪問者です.恐らくボットだという事は分かっているのですが、ボットと判定しづらい方法でアクセスしているので、アナリティクス(アクセス解析)にもカウントされます.

それが少々困っています.毎分でアクセスしてくるので非常にサーバーに負荷がかかっているのは分かっているのですが、どうしようもない.国ごとアクセスを遮断するプログラムをそのうち入れようと思っています.

一番簡単な遮断方法はMaxMindのPHPライブラリを使えば良いらしい.これを使用するとIPから何処の国からアクセスしてきたか判別可能になります.だけど使用するにはライブラリの他にデータベース(IP)をダウンロード必要があり、ダウンロードするにはMaxMindでアカウントを登録しないデータベースがダウンロード出来ないようになっているので自分はそこで止まっています.規約がなぁ….。

<?php

require 'vendor/autoload.php';//絶対パスが宜しいかと

use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Schema\Blueprint;

class counter
{
    public $targetId = 1;
    public $cnt = 0;
    public $dbPath = 'counter/cnt.db';//絶対パスが宜しいかと

    public function __construct($dbPath = null,$targetId=null)
    {
        $dbPath = $dbPath ?? $this->dbPath;
        $this->targetId = $targetId??$this->targetId;

        // DBファイルが無ければ作成(空ファイル)
        if (!file_exists($dbPath)) {
            touch($dbPath);
        }

        // Capsuleインスタンス
        $capsule = new Capsule();

        // SQLite接続
        $capsule->addConnection([
            'driver'   => 'sqlite',
            'database' => $dbPath,
            'prefix'   => '',
        ]);

        $capsule->setAsGlobal();
        $capsule->bootEloquent();

        /**
         * zcnt テーブルが無ければ作成
         */
        if (!DB::schema()->hasTable('cnt_tbl')) {
            DB::schema()->create('cnt_tbl', function (Blueprint $table) {
                $table->integer('id')->primary();
                $table->integer('cnt');
            });

            // 初期データ投入
            DB::table('cnt_tbl')->insert([
                'id'  => $this->targetId,
                'cnt' => 1,
            ]);
        }

        return $this;
    }

    public function getCounter()
    {
        $zcnt = DB::table('cnt_tbl')->where('id', $this->targetId)->first();
        $this->cnt = $zcnt?->cnt;
        return $this;
    }

    public function setCounter()
    {
        if (!is_null($this->cnt)) {
            $this->cnt++;
            DB::table('cnt_tbl')->where('id', $this->targetId)->update([
                'cnt' => $this->cnt
            ]);
        }
    }

    public function output()
    {
        print json_encode([
            'cnt' => $this->cnt
        ]);
    }
}

明日へ続く