php Скрипт записи логов посещений сайта 

Дата публикации  Дата изменения01.10.21  КомментарииНет   Просмотры46351

Курсы

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

Скрипт будет полезен для тех, кто пользуется хостингом без предоставления доступа к log-файлам.

Добавляете PHP-код в начало страниц, при посещении которых будут писаться логи:

 <?php
$file="base.log";    //куда пишем логи
$col_zap=4999;        //строк в файле не более
//
function getRealIpAddr() {
  if (!empty($_SERVER['HTTP_CLIENT_IP']))        // Определяем IP
  { $ip=$_SERVER['HTTP_CLIENT_IP']; }
  elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))    // Если IP идёт через прокси
  { $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'];    //какая страница сайта
$lines = file($file);
while(count($lines) > $col_zap) array_shift($lines);
$lines[] = $date."|".$bot."|".$ip."|".$home."|\r\n";
file_put_contents($file, $lines);
?>

Либо, если у Вас на каждой страничке подгружается какой-нибудь php-файл через include, то поместите этот код в тот самый подгружаемый php-файл.

Для просмотра результатов лога, создайте php-файл с любым именем:

<?php
if (isset($_GET[col])) { $col=$_GET[col]; } else { $col=50; }
$file=file("base.log"); 
?>
<html>
<head>
<style type='text/css'>
 td.zz {padding-left: 3px; font-size: 9pt; padding-top: 2px; font-family: Arial; }
</style>
</head>
<body>
<center>
<?php
if ($col>sizeof($file)) { $col=sizeof($file); }
echo "Последние <b>".$col."</b> посещений сайта:"; 
?>
<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>
<?php
   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]; // адрес посещения
echo '<tr bgcolor="#eeeeee"><td class="zz">'.$q1[$si].'</td>';
echo '<td class="zz">'.$q2[$si].'</td>';
echo '<td class="zz">'.$q3[$si].'</td>';
echo '<td class="zz">'.$q4[$si].'</td></tr>';
}
echo '</table>';
echo '<br>Просмотреть последние <a href=?col=100>100</a> <a href=?col=500>500</a>';
echo '<a href=?col=1000>1000</a> посещений.';
echo '<br>Просмотреть <a href=?col='.sizeof($file).'>все посещения</a>.</center>';
echo '</body></html>';
?>

При обращении к файлу просмотра результатов лога, на экране будет отображаться примерно такая табличка:

Последние 5 посещений сайта:

Время, датаКто посещалIP, проксиПосещенный URL
19:08:40 04.11Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)211.11.11.11/log_info.php
19:06:19 04.11Mozilla/4.0 (Windows 98; US) Opera 10.00 [en]123.23.23.23/video_download.php
19:00:06 04.11Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0122.22.22.22current_time.php
18:45:59 03.11Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.8.131 Version/11.11111.11.11.11/script_menu_left.php
18:45:59 03.11Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.8.131 Version/11.11111.11.11.11/script_menu_left_example.php


Источник

*UPD

Ранее рассматривали Скрипт записи логов посещений сайта, но как потом выяснилось, у него имелось пару недочетов. Главный недочет заключался в том, что при большой посещаемости могла потеряться часть лога из-за того, что не было блокировки файла лога на момент записи/чтения. Так же разнесены логи поисковиков и обычных посетителей в разные файлы.

Для того чтобы писать логи в файл, добавьте в шаблон, либо в начало страниц, при посещении который будут писаться логи:

<?php
$file="base_bot";        //имя файла с логами ботов
$col_zap=2499;            //записей в логе ботов

$xxx=trim(strip_tags($_SERVER['HTTP_USER_AGENT']));
if (strpos($xxx, 'YandexBot')!==false) {$bot='YandexBot';}
elseif (strpos($xxx, 'Googlebot')!==false) {$bot='Googlebot';}
elseif (strpos($xxx, 'bingbot')!==false) {$bot='Bingbot';}
elseif (strpos($xxx, 'Mail')!==false) {$bot='Mail.ru';}
elseif (strpos($xxx, 'YandexBlogs')!==false) {$bot='YandexBlogs';}
elseif (strpos($xxx, 'YandexImage')!==false) {$bot='YandexImages';}
elseif (strpos($xxx, 'YandexFavicons')!==false) {$bot='YandexFavicons';}
elseif (strpos($xxx, 'YandexDirect')!==false) {$bot='YandexDirect';}
elseif (strpos($xxx, 'YandexNews')!==false) {$bot='YandexNews';}
elseif (strpos($xxx, 'YandexSomething')!==false) {$bot='YandexSomething';}
elseif (strpos($xxx, 'YandexMetrika')!==false) {$bot='YandexMetrika';}
elseif (strpos($xxx, 'YandexAntivirus')!==false) {$bot='YandexAntivirus';}
elseif (strpos($xxx, 'Feedfetcher-Google')!==false) {$bot='Feedfetcher-Google';}
elseif (strpos($xxx, 'Googlebot-Image')!==false) {$bot='Googlebot-Image';}
elseif (strpos($xxx, 'Yahoo')!==false) {$bot='Yahoo!';}
elseif (strpos($xxx, 'WebCrawler')!==false) {$bot='WebCrawler';}
elseif (strpos($xxx, 'ZyBorg')!==false) {$bot='ZyBorg';}
elseif (strpos($xxx, 'Scooter')!==false) {$bot='AltaVista';}
elseif (strpos($xxx, 'StackRambler')!==false) {$bot='Rambler';}
elseif (strpos($xxx, 'Aport')!==false) {$bot='Aport';}
elseif (strpos($xxx, 'lycos')!==false) {$bot='Lycos';}
elseif (strpos($xxx, 'fast')!==false) {$bot='Fast Search';}
elseif (strpos($xxx, 'msnbot')!==false) {$bot='MSN';}
elseif (strpos($xxx, 'Nigma.ru')!==false) {$bot='Nigma';}
elseif (strpos($xxx, 'ia_archiver')!==false) {$bot='Alexa';}
elseif (strpos($xxx, 'Baiduspider')!==false) {$bot='Baidu';}
elseif (strpos($xxx, 'Exabot')!==false) {$bot='Exabot';}
elseif (strpos($xxx, 'archive.org_bot')!==false) {$bot='Archive.org';}
elseif (strpos($xxx, 'Ezooms')!==false) {$bot='Ezooms';}
elseif (strpos($xxx, 'GrepNetstat.com Bot')!==false) {$bot='GrepNetstat.com';}
elseif (strpos($xxx, 'MJ12bot')!==false) {$bot='Majestic-12';}
elseif (strpos($xxx, 'AhrefsBot')!==false) {$bot='Ahrefs';}
elseif (strpos($xxx, 'TurnitinBot')!==false) {$bot='Turnitin';}
elseif (strpos($xxx, 'discobot')!==false) {$bot='Discobot';}
elseif (strpos($xxx, 'Subscribe.Ru')!==false) {$bot='Subscribe';}
elseif (strpos($xxx, 'TOP.NET.RU')!==false) {$bot='TOP.NET.RU';}
elseif (strpos($xxx, 'SISTRIX Crawler')!==false) {$bot='SISTRIX';}
elseif (strpos($xxx, 'Wotbox')!==false) {$bot='Wotbox';}
else {
    $file="base_user";        //имя файла с логами пользователей
    $col_zap=3499;            //записей в логе пользователей
    $bot=htmlspecialchars(substr($xxx,0,80));//обрезаем USER-AGENT до 80 символов
}
//записываем логи в файл с блокировкой
$l_cash='';
$fh=fopen($file,"a+");
flock($fh,LOCK_EX);
fseek($fh,0);
while (!feof($fh)) $l_cash.= fread($fh,8192);
$lines=explode("\n",$l_cash);
while(count($lines)>$col_zap) array_shift($lines);
$l_cash=implode("\n",$lines);
$l_cash.=date("H:i:s d.m")."|".$bot."|".$_SERVER['REMOTE_ADDR']."|".
    htmlspecialchars($_SERVER['REQUEST_URI'])."\n";
ftruncate($fh,0);
fwrite($fh,$l_cash);
flock($fh,LOCK_UN);
fclose($fh);
?>

Как видно, код стал гораздо больше, но это связано с тем, что в него добавлено проверка на ботов, которые чаще всего посещают сайты.

Для просмотра результатов лога нужно создать отдельный PHP файл с любым названием:

<?php
if (isset($_GET["col"])) $col=$_GET["col"]; else $col=50;
$lines_cashe=file_get_contents("base_user", LOCK_EX);
$file=explode("\n",$lines_cashe);
$size_f=count($file)-1;
?>
<html>
<head>
<style type='text/css'>
 td.zz { padding-left: 3px; font-size: 9pt; padding-top: 2px; font-family: Arial; }
</style>
</head>
<body>
<div style="text-align: center;">
<?php
if ($col>$size_f) $col=$size_f;
echo 'Последние <b>'.$col.'</b> посещений сайта ботами:';
?>
<table style="width: 750px; table-layout: fixed; border: 0;">
<tr bgcolor="#eeeeee">
 <td class="zz" style="width: 100px;"><b>Время, дата</b></td>
 <td class="zz" style="width: 250px;"><b>Кто посещал</b></td>
 <td class="zz" style="width: 100px;"><b>IP, прокси</b></td>
 <td class="zz" style="width: 300px;"><b>Посещенный URL</b></td>
</tr>
<?php
for ($si=$size_f-1; $si>=$size_f-$col; $si--) {
$str=explode("|",$file[$si]);
echo '<tr bgcolor="#eeeeee"><td class="zz">'.$str[0].'</td>';
echo '<td class="zz">'.$str[1].'</td>';
echo '<td class="zz">'.$str[2].'</td>';
echo '<td class="zz"><a href="http://usefulscript.ru'.$str[3].'">'.$str[3];
echo '</a></td></tr>';
}
echo '</table>';
echo '<br>Просмотреть последние <a href=?col=100>100</a> <a href=?col=500>500</a> ';
echo '<a href=?col=1000>1000</a> посещений.';
echo '<br>Просмотреть <a href=?col='.sizeof($file).'>все посещения</a>.';
echo '</div></body></html>';
?>

В таблице будут отображаться только визиты простых пользователей (т.к. в base_user содержатся логи пользователей). Для того чтобы просмотреть логи ботов, Вам необходимо по аналогии создать еще один точно такой же PHP файл, в котором необходимо будет заменить имя файла с логами (base_user на base_bot).


Источник

Бесплатные курсы

Категории

Теги: , , ,

Оцените материал:

Рейтинг: 10.0/10 (3)


КомментарииКомментарии:

Нет комментариев к этой статье.


 

Старые →← Новые