Делаем простой счётчик посещаемости на чистом PHP
Многие начинающие веб-мастера обвешивают свой новый сайт тяжелыми системами статистики, вроде Яндекс-метрики и Гугл-аналитки. Конечно, если у вас лендинг, или портал с множеством посетителей эти системы вам здорово помогут. Но если ваш сайт совсем свежий, и направлен не на продажи, а на написание информационных статей, то на первых порах сторонние системы статистики ставить нежелательно.
Во-первых это замедлит загрузку сайта. Во-вторых у Яндекса и Гугла будет доступ к точному количеству посетителей вашего сайта, и если оно небольшое, ваш сайт будет плохо ранжироваться в поисковой выдаче. Пока у вас немного посетителей, лучше скрыть от поисковых гигантов истинную посещаемость. Для этого достаточно сделать свой простой скрипт для сбора статистики.
Ниже я покажу пример скрипта на PHP который подключается к любой странице вашего сайта путем простой команды include('stat.php'). Будет собираться статистика просмотров за прошедшие сутки, игнорируя поисковых ботов и неуникальных посетителей. Кроме того, в статистике будет видно с каких устройств заходят люди, и на какие именно страницы вашего сайта.
Скрипт не использует базу данных, сохраняя статистику в обычный текстовый файл stat.txt. Позаботьтесь настроить права доступа к этому файлу только от ваших скриптов изнутри сервера.
Основной скрипт, который будет собирать статистику выглядит так:
Листинг stat.php
<?php
$file = 'stat.log'; // файл для записи истории посещения сайта
$col_zap = 1999; // ограничиваем количество строк log-файла
function getRealIpAddr() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
if (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')) {
$bot = 'YandexBot';
}
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')) {
$bot = 'Googlebot';
}
else {
$bot = $_SERVER['HTTP_USER_AGENT'];
}
$ip = getRealIpAddr();
$date = date("H:i:s d.m.Y");
$home = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if (stristr($bot, 'bot') === FALSE) {
$lines = file($file);
while (count($lines) > $col_zap) {
array_shift($lines);
}
$lines[] = $date . '|' . $bot . '|' . $ip . '|' . $home . "|\r\n";
file_put_contents($file, $lines);
}
?>
Этот файл нужно подключить во все ваши PHP скрипты отвечающие за вывод страниц сайта. Для примера я сделаю пустую страничку test.php в которую подключу скрипт наш статитстики.
Листинг test.php
<?php
include('stat.php');
echo('Test');
?>
Не забудьте создать в той же директории где лежит скрипт статистики пустой файл stat.txt и правильно настроить права доступа к нему. Если мы начнем заходить на страничку test.php то скрипт будет записывать наши посещения в этот файл.
И наконец, мы можем посмотреть записанную статистику в табличном виде, с помощью следующего скрипта.
Листинг seestat.php
<?php
session_start();
$pass = 'mypassword';
$adminavt = 0;
if ((isset($_POST['slovo']) || isset($_POST['sekret'])) || ($_SESSION['sekret'] == md5($pass))) {
$_SESSION['sekret'] = md5($pass);
$adminavt = 1;
}
else {
$code .= ('<center><form method="POST" action="seestat.php" style="margin-top: 30px;"><div style=" color: black; width: 500px; height: 100px; line-height: 100px; font-size: 24px; letter-spacing: 1px;">Панель администратора</div><input type="text" placeholder="Введите пароль" name="slovo" size="100" style="margin-top: 10px; background: #eee; color: black; font-size: 18px; width: 494px; height: 30px; line-height: 30px; "><br><input type=submit name="save" value="Войти в систему" style=" border: none; display: block; text-decoration: none; margin-top: 10px; background: #006064; text-align: center; width: 500px; height: 35px; line-height: 35px; font-size: 14px; font-weight: 500; border-radius: 2px; text-decoration: none; color: white; text-transform: uppercase;"></form></center>');
echo($code);
};
if (($adminavt == 1) || ($_POST['slovo'] == $pass) || ($_SESSION['sekret'] == md5($pass))) {
$_SESSION['sekret'] = md5($pass);
$code = '';
$mode = $_GET['mode'];
if (isset($_GET[col])) {
$col = $_GET[col];
}
else {
$col = 500;
}
$file = file("stat.log");
if ($col > sizeof($file)) {
$col = sizeof($file);
}
$code = ('<table width="680" cellspacing="1" cellpadding="1" border="0" style="table-layout:fixed"><tr bgcolor="#eeeeee"><td class="zz" width="100"><b>Время и дата</b></td><td class="zz" width="200"><b>Данные о посетителе</b></td><td class="zz" width="100"><b>IP/прокси</b></td><td class="zz" width="280"><b>Посещенный URL</b></td></tr>');
$kd = 0;
$mas[] = array();
$yd = date('d.m.Y', strtotime('yesterday'));
for ($si = sizeof($file) - 1; $si + 1 > sizeof($file) - $col; $si--) {
$string = explode('|', $file[$si]);
$q1[$si] = $string[0]; // дата и время
$q2[$si] = $string[1]; // имя бота
$q3[$si] = $string[2]; // ip бота
$q4[$si] = $string[3]; // адрес посещения
if ((strstr($string[0], $yd)) && (!in_array($string[2], $mas))) {
$kd = $kd + 1;
};
$mas[] = $string[2];
$code .= '<tr bgcolor="#eeeeee"><td class="zz">' . $q1[$si] . '</td><td class="zz">' . $q2[$si] . '</td><td class="zz">' . $q3[$si] . '</td><td class="zz">' . $q4[$si] . '</td></tr>';
};
$code = '<html><head><style type="text/css"> td.zz { padding-left: 3px; font-size: 9pt; padding-top: 2px; font-family: arial; } </style></head><body style="padding-top: 20px;"><center>За вчерашний день ваш сайт посетили: <b>' . $kd . '</b> уникальных посетителей<br><br>' . $code . '</table><br>Просмотреть последние <a href=?col=1000>1000</a> посещений.<br>Просмотреть <a href=?col=' . sizeof($file) . '>все посещения</a>.</center></body></html>';
echo($code);
}
?>
Если мы зайдем в seestat.php, он попросит нас ввести пароль, для доступа к статистике. По умолчанию пароль: mypassword.
Выглядеть наша статистика будет примерно вот так:
Скачать исходники всех скриптов из данной статьи можно тут:
Вы можете дорабатывать данный скрипт. Например, определять по IP город пользователя, строить графики посещений на основе сохраненных данных, применить вместо файла stat.txt базу данных, и так далее.
Материал подготовлен автором @pythono