tuduf.ruhobbytech.itweb › visitorStats

write: 19/04/2023 / modified: 27/09/2024

Скрипт для ведения статистики посетителей и записи в базу SQLite. Можно было сделать и лучше, а еще лучше, наверное, вообще не делать. В целях изучения PDO SQLite, PHP и немного JS, да и просто посмотреть как циферки с буковками записываются в нужные таблички: ищутся, сравниваются, а потом красиво рисуются графики нашествия ботов.

Определяет и записывает в таблицу visitors уникальных посетителей и общее количество заходов на страницы. При первом заходе создается хэш из $_SERVER['HTTP_USER_AGENT'] и $_SERVER['REMOTE_ADDR'] hash_hmac('sha256', "$client_ip", "$user_agent") и записывается в таблицу, при последующем заходе скрипт сравнивает в базе хэш и если такой уже есть на текущий день, то прибавляет 1 к total_hits_per_day.

определение и запись в таблицу visitors страны посетителя через сайт ipinfo.io country;
определение и запись в таблицу visitors браузера посетителя browser;
определение и запись в таблицу visitors имени ботов robot (is_bot - 1 бот, 0 не бот);
запись запрашиваемых страниц $_SERVER['REQUEST_URI'] в таблицу visitors_request и количество запросов за все время;
Выбор промежутка времени отображения статистики

Для возможности очистки таблицы visitors паралельно ведется запись в таблицу visitors_archive с тремя колонками date_time, unique_hits и total_hits.

TODO:

Добавить возможность очисти на странице статистики;
Добавить возможность подгружать историю посещений из архива;
При обильных запросах ipinfo.io выдает 429 ошибку (To Many Requests);

Как вариант можно использовать IP Geolocation API - 45 запросов в минуту с одного IP-адреса, при превышении лимита будет так же отдаваться 429-я ошибка до тех пор, пока не будет сброшено ограничение. При постоянном превышении лимита, IP-адрес будет заблокирован на 1 час.

<?php
$ch = curl_init('http://ip-api.com/json/' . $_SERVER['REMOTE_ADDR'] . '?lang=ru');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, true);
print_r($res);
Array([country] => Россия [countryCode] => RU)

Или DaData.ru - Бесплатен до 10 000 запросов в сутки, максимум 20 запросов в секунду.

<?php
$ch = curl_init('https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address?ip=' . $_SERVER['REMOTE_ADDR']);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, true);
print_r($res);
Array ([location] => Array([data] => Array([country] => Россия [country_iso_code] => RU)))

Отображение графиков посетителей с помощью JavaScript-библиотеки Chart.js.

линейный график с тремя наборами данных (общее количество посетителей, уникальные посетители и боты);
гистограмма стран посетителей в порядке убывания (для примера выставлен лимит 15);
кольцевая диаграмма для отображения статистики браузеров пользователей;
круговая диаграмма для отображения статистики посетивших ботов;
Адаптивный дизайн графиков и таблиц.

Код доступен на GitHub.

tags: programming web php javascript sqlite