Сейчас: 11:59:48   26-го апреля 2024 г.
UsefulScript.ruСкриптыЗащита сайтаСкрипт логов посещения сайта
10
60

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

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


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


Для работы скрипта необходима поддержка хостингом PHP.


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

PHP код:
<?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_zaparray_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 код:

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-left3pxfont-size9ptpadding-top2pxfont-familyArial; }
</
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>';
?>

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

Последние 5 посещений сайта:
Время, дата Кто посещал IP, прокси Посещенный URL
12:49:33 07.04Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0221.21.21.21/script.php
12:48:16 07.04Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0221.21.21.21/calendar.php
12:43:04 07.04Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0233.33.33.33/advego.php
12:38:00 07.04Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1144.44.44.44/video_download.php
12:36:37 07.04Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.8.131 Version/11.11112.12.12.12/rotator_banner.php

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

Дата создания: 14:10:02 07.04.2013 г.
Посещений: 24692 раз(а).

Комментарии посетителей (86 шт.):
Amizon1000
3
# 912
(20:15:31  06.06.2013 г.)

Здравствуйте. При просмотре результата лога появляется надпись:
Warning: file_get_contents(base_user) [function.file-get-contents]: failed to open stream: No such file or directory in /home/b/...
Подскажите, пожалуйста, где моя ошибка?
Ответить

Administrator
1
# 913
(20:20:36  06.06.2013 г.)

Это значит "Нет такого файла или каталога в /home/b/..."
Проверьте, находятся ли файл просмотра результата лога и файл base_user в одной папке. Если файлы в разных папках, то к файлу base_user указывайте полный путь (например, usefulscript.ru/logs/base_user).
Ответить

Amizon1000
0
# 914
(22:04:28  06.06.2013 г.)

Если можно, про файл «base_user» разъясните, пожалуйста, подробнее (что это за файл и как его создать).
Ответить

Administrator
0
# 915
(22:17:00  06.06.2013 г.)

base_user - файл, в котором будут храниться логи посетителей (кроме ботов, которых мы указали в первой части кода). Создавать его самому не надо, скрипт сам его создаст. Можно указать к нему полный путь в переменной $file="base_user";
В нашем примере предполагается, что скрипт записи логов, сам файл логов (base_user) и файл просмотра логов будут находиться в одной папке.
Ответить

Amizon1000
-1
# 916
(22:41:18  06.06.2013 г.)

Всё заработало. Спасибо! Последнее уточнение для информации. Получается, пока не было ни одного посещения, поэтому и надпись была такая: «Warning: file_get_contents(base_user) [function.file-get-contents]: failed to... и т.д.»? То есть скрипт этот лог файл создал сам после посещения бота ( Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0 )?
Ответить

Administrator
0
# 917
(22:53:02  06.06.2013 г.)

Да, все верно.
Ответить

Max
0
# 984
(11:53:59  19.07.2013 г.)

А как вставить скрипт в код html? Делал <?php include 'phpip.php' ?> но похоже не вставляет, т.к. появляется Warning: file_get_contents(base_user) [function.file-get-contents]: failed to open stream: No such file or directory in....
Ответить

Administrator
0
# 985
(18:35:32  19.07.2013 г.)

Max, прочитайте предыдущие комментарии к данной теме. У Вас точно такая же ошибка.
Ответить

masik
0
# 1545
(15:30:38  27.03.2014 г.)

У меня при загрузке страницы со скриптом пишет эту ошибку:
Fatal error: Maximum execution time of 30 seconds exceeded in /home/vhosts/www...eu/index.php on line 118
На 118 строке у меня следующий код:
while (!feof($fh)) $l_cash.= fread($fh,8192);
Что здесь не так?
Ответить

Administrator
0
# 1546
(22:36:47  27.03.2014 г.)

Эта ошибка возникает, если скрипт выполнятся более 30 секунд. Скорее всего, скрипт не может получить доступ к файлу.
Ответить

Павлуша
0
# 1577
(18:01:37  06.04.2014 г.)

Отличное решение! Как только увидел, сразу не раздумывая поставил себе на сайт! Но когда просматривал лог работы PHP на сервере, обнаружил такую ошибку: 2014-04-06 17:33:52: (mod_fastcgi.c.2676) FastCGI-stderr: PHP Notice: Use of undefined constant col - assumed 'col' in /var/www/log/boot.php on line 2 -boot.php это страница просмотра логов, ругается на переменную col! Не подскажите, в чём может быть причина и как её решить?
Ответить

Administrator
0
# 1578
(19:00:14  06.04.2014 г.)

Возьмите col внутри $_GET[] в кавычки:
if (isset($_GET["col"])) $col=$_GET["col"]; else $col=50;
Ответить

Павлуша
0
# 1579
(00:10:41  07.04.2014 г.)

Помогло! Отличный проект, радуют уникальные решения. Кстати есть идея для Вашей рубрики на форуме "Хитрости" - гайд о том как спрятать (замаскировать) от посторонних глаз ссылку в тексте :).
Спасибочки Вам ОГРОМНЫЕ!!!
Ответить

Михаил
0
# 1609
(16:23:10  17.04.2014 г.)

Замечательный скрипт, работает без сбоев. Есть только одна маленькая просьба. Добавьте, пожалуйста, код для отправки логов на две-три почты (user@mail.ru, user@yandex.ru). В php я полный ноль, поэтому извиняйте. Не могу разобраться с $to="" $subject="" и т.д. А вообще огромное спасибо за то, что уже сейчас Вами сделано!!!
Ответить

Роман
0
# 1834
(11:48:34  28.08.2014 г.)

Добрый день. Скажите, пожалуйста, что значит $col_zap=2499; и $col_zap=3499;? Это максимальное количество строк в файле или объем файла?
И где вы набрали такой список? (Это про яндекс_бот и др.), что делать если что-то изменится? Как об этом узнать и где? Заранее благодарю.
Ответить

Administrator
0
# 1835
(15:20:10  28.08.2014 г.)

$col_zap - это количество строк (записей) в файлах (всего их два - для ботов и для всех остальных).
Список ботов был сформирован на основе данных логов нашего сайта. Количество разнообразных ботов со временем меняется и за всеми не уследить. Мы привели самые популярные, но всегда можно посмотреть в логах в файле base_bot какие еще боты приходят к Вам на сайт и при желании добавить их в скрипт.
Ответить

Роман
0
# 1836
(16:39:05  28.08.2014 г.)

У меня еще вопрос: не легче ли использовать функции: file () и file_put_contents с параметром FILE_APPEND? и почему вы используете файлы, а не заносите подобные данные в БД? С БД работать проще.
Ответить

Administrator
0
# 1837
(20:53:10  28.08.2014 г.)

Когда писал данный скрипт, то что-то не заладилось с блокировкой файлов (при тестировании она не срабатывала) вот и пришлось отказаться от использования данных функций для того чтобы не потерять данные во время работы с файлами. С БД работать естественно проще и удобнее, просто задумка была сделать без использования БД.
Ответить

Евгений
0
# 1899
(18:08:30  22.09.2014 г.)

Скрипт возвращает ошибку 504, в чем может быть проблема?
Ответить

Administrator
0
# 1900
(18:17:43  22.09.2014 г.)

В неправильной установке скрипта или в настройках сервера.
Ответить

Альберт
0
# 1945
(21:11:33  05.10.2014 г.)

Здравствуйте. Сайт на joomla.
Скрипт работает. Вопрос - в логе видно, что с моего хостинга (77.222.61.14) идут постоянно запросы вида:
19:11:15 05.10 77.222.61.14 //index.php?option=com_content&view=article&id=77,
номер 77 это страница 404. Что могут означать эти запросы?
Ответить

Administrator
0
# 1946
(21:53:17  05.10.2014 г.)

Могу предположить, что у Вас раньше была страничка с id=77, потом ее не стало, но ссылка на нее где-то осталась, откуда и идут переходы.
Ответить

Павел
0
# 2183
(12:47:28  13.01.2015 г.)

Добрый день! Начал пользоваться Вашим скриптом на локальном сайте. Во-первых, благодарность Вам за работу, а во-вторых, вопрос: при обновлении странички статистики появляется посещение favicon/ico. Сколько раз обновишь, столько раз это посещение и добавляется. В чем может быть проблема. И если можно, то как добавить в статистику рефереров, разрешение монитора и ОС. Заранее благодарен.
Ответить

Administrator
0
# 2184
(20:28:05  13.01.2015 г.)

Тут надо уточнить favicon/ico появляется дополнительной строкой или только она одна? А так, многое зависит от структуры и движка сайта. В нашем примере посещаемую страничку мы получаем при помощи $_SERVER['REQUEST_URI'].
Добавить реферера можно путем добавления в строку "$l_cash.=date("H:i:s d.m")."|"..." данных из переменной $_SERVER['HTTP_REFERER']. Для определения ОС - могу порекомендовать выделять ее из переменной $_SERVER['HTTP_USER_AGENT'], а вот с разрешением монитора хуже, т.к. его можно получить только на JavaScript.
Ответить

Павел
0
# 2185
(11:56:53  14.01.2015 г.)

Сайт на html+css порезан с помощью PHP (баз нет). При обновлении страницы статистики появляется одно посещение /favicon.ico , при следующем обновлении второе и т.д. Если открыть страницу по ссылке этого не происходит. Строку с иконкой favicon я удалил везде, но она все равно появляется не пойму откуда.
Спасибо за быстрый ответ. С уважением.
Ответить

Administrator
0
# 2214
(20:20:44  21.01.2015 г.)

Тут надо копаться в Вашем исходном коде и смотреть откуда берется favicon.ico, т.к. в нашем скрипте этого нет.
Ответить

Алексей!
1
# 2193
(21:52:33  15.01.2015 г.)

Огромное спасибо за предоставленный код скрипта Авторам! Испытывал как на Денвере, так и на реальном хосте! При первой установке работает все хорошо, дальше гляну, как будет вести себя. Сделал через админ панель. Еще я сам код скрипта не добавил на основной файл сайта, а занес его в отдельный, и просто подключил через инклюде в начале файла!
Спасибо за труды!
Ответить

Алексей!
0
# 2194
(21:55:10  15.01.2015 г.)

У меня один вопрос!
Как установить код очистки логов! При помощи вашего данного кода:
if (isset($_POST[del_log])) {
file_put_contents('base.log', '');
header("Location: admin.php");
}
<form method="POST" action="admin.php">
<input type="submit" name="del_log" value="Очистить лог">
Ответить

Administrator
0
# 2195
(22:00:41  15.01.2015 г.)

А зачем лог чистить самому, если в скрипте предусмотрено ограничение на максимальное количество строк (записей) лога, после чего самые старые записи удаляются при появлении новых.
Ответить

Вячеслав
1
# 2410
(13:29:00  21.04.2015 г.)

Для чистки логов я создал файл "rbase_user.php" и вписал код:
<?php $des = fopen("base_user","w"); fclose("base_user"); ?>.
Файл разместил на сервере, где лежат файлы сайта.
Теперь при нажатии на ссылку "ваш сайт.ru/rbase_user.php"
статистика очищается. Также делаем другой файл rbase_bot.php для очистки статистики ботов, или можно очищать одним файлом, вписав:
<?php $des = fopen("base_bot","w"); fclose("base_bot"); ?> в файл "rbase_user.php".

P.S. Следующий комментарий был вынесен на форум.
Ответить

Алексей!
0
# 2196
(22:33:33  15.01.2015 г.)

Спасибо за разъяснение!
А не подскажете код капчи? Что в этой форме?
И еще, а у вас на сайте нет скрипта по блокировки ип адресов для не доступа к сайту?
Ответить

Administrator
0
# 2197
(22:59:27  15.01.2015 г.)

Это не капча, а обычные цифры. Как это сделано можете посмотреть в теме Форма добавления комментариев. Но есть и капча: Капча для защиты сайта от ботов.
Как заблокировать доступ к сайту или Временная блокировка доступа к сайту.
Есть же поиск по сайту, пользуйтесь.
Ответить

Sergey
0
# 2204
(16:12:29  20.01.2015 г.)

Можно ли не посредственно в этом скрипте указать ип адрес который бы не писался в лог.
Ответить

Administrator
0
# 2208
(21:26:29  20.01.2015 г.)

Конечно можно. Сравниваете текущий IP адрес с указанным, и если они не совпали, то записываем логи...
Ответить

Sergey
0
# 2209
(21:57:43  20.01.2015 г.)

Вы меня наверное не так поняли, я не программист, покажите кусок кода который надо добавить в выше указанный в котором можно было бы добавить ип, который не будет писаться в лог.
Ответить

Administrator
0
# 2210
(22:14:19  20.01.2015 г.)

Перед строчкой: $l_cash='';
Добавьте: if ($_SERVER['REMOTE_ADDR']!='127.0.0.1') {
127.0.0.1 естественно замените на нужный IP адрес. Не забудьте после fclose($fh); добавить закрывающую скобку!
Ответить

Sergey
0
# 2211
(22:32:03  20.01.2015 г.)

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

Денис
0
# 2255
(16:45:46  08.02.2015 г.)

Неплохо, можно сделать еще лучше: подключить GeoIP, добавить иконки к странам.
Ответить

Илья
0
# 2339
(20:19:06  15.03.2015 г.)

А можно сделать сортировку по дате?
Ответить

Administrator
0
# 2341
(20:37:43  15.03.2015 г.)

Зачем? Данные в файле и так отсортированы по времени в порядке записи. Если очень хочется сделать в обратном порядке, то ковыряйте строчку for ($si=$size_f-1; $si>=$size_f-$col; $si--) {
Ответить

Вячеслав
0
# 2398
(10:54:07  18.04.2015 г.)

Возможно сделать или нет сортировку по IP адресу, если сайт посещался несколько раз с одного IP, но в разное время.
Ответить

Administrator
0
# 2400
(16:09:04  18.04.2015 г.)

Возможно, но для этого нужно записывать значение IP адреса первым значением строки.
Замените $l_cash.=date("H:i:s d.m")."|".$bot."|".$_SERVER['REMOTE_ADDR']."|".
на $l_cash.=$_SERVER['REMOTE_ADDR']."|".date("H:i:s d.m")."|".$bot."|".
А в коде просмотра результатов лога после $size_f=count($file)-1; добавьте сортировку rsort($file);
Ответить

Вячеслав
0
# 2416
(03:21:45  22.04.2015 г.)

Возможно или нет добавить в таблицу колонку на какую страницу перешёл посетитель как в этом скрипте:
<?php
$file = fopen("bases.txt","a+");
$ip = getenv(REMOTE_ADDR);
$time = date("H:i:s d M Y");
$url_o = getenv(HTTP_REFERER);
$url_k = getenv(REQUEST_URI);
$soft = getenv(HTTP_USER_AGENT);
$all = "$ip ; $time ; $url_o ; $url_k ; \n";
fwrite($file,$all );
fclose($file);
?>
$url_o; $url_k - две переменные откуда и куда по сайту перешёл посетитель, как будет выглядеть код для переменной $url_k в вашем скрипте?
Мне понравился скрипт добавления комментария к теме, можно у Вас код позаимствовать?
Ответить

Administrator
0
# 2419
(20:55:30  23.04.2015 г.)

REQUEST_URI - содержит адрес текущей странички, и отследить куда по сайту перешёл посетитель не получится.
Все необходимые для записи данные нужно добавлять в переменную l_cash.
Код скрипт комментариев можете посмотреть в теме Добавление комментариев на сайт.
Ответить

Марьяна
0
# 2442
(12:37:27  30.04.2015 г.)

Здравствуйте, подскажите, пожалуйста, а возможно ли в логи вообще записывать все, что мы хотим? Например, нас интересует, коды товаров, по которым кликают пользователи (сайт интернет магазина).
Ответить

Administrator
0
# 2443
(18:01:27  30.04.2015 г.)

Возможно, но не в этом скрипте. Данный скрипт предназначен для ведения логов посещений страничек. Для того чтобы сделать как Вы говорите, лучше использовать jQuery. Тогда можно будет отслеживать клики по нужным элементам и отправлять необходимые данные на сервер POST запросом.
Ответить

Андрей
0
# 2614
(10:39:05  12.08.2015 г.)

Здравствуйте.
1) У меня возник вопрос в строке
while (!feof($fh)) $l_cash.= fread($fh,8192);
Я так понимаю, что в этой строке идет накопление содержимого файла со статистикой в переменную $l_cash. Скажите, что за магическое число 8192. И нельзя ли эту строку заменить на: $l_cash = fread($fh, filesize($fh));
либо строку: $l_cash = file_get_contents (“имя лог файла”);

2) В коде чтения статистики из лог-файла использована функция file_get_contents с запиранием файла.
$lines_cashe=file_get_contents("base_user", LOCK_EX);
Скажите, а отпирание файла происходит автоматически после его прочтения?
Ответить

Administrator
0
# 2626
(22:48:24  13.08.2015 г.)

1) Это число нужно при работе с удаленными файлами. Если работа с таковыми не планируется, то можете смело заменить на предложенный Вами вариант.
2) Да. Данный скрипт (с минимальными изменениями) долгое время был установлен и на данном сайте. Проблем не возникало.
Ответить

Андрей
0
# 2616
(10:54:13  12.08.2015 г.)

Еще вопрос. В предыдущем скрипте в качестве разделителя строк применялось "\r\n", в новом скрипте использовано "\n" У кого-то были проблемы с разделителем? У меня на Винде и так все отлично работало.
Ответить

Administrator
0
# 2627
(22:53:19  13.08.2015 г.)

\r - возврат каретки. \n - новая строка.
Смысла переводить каретку в начало пустой строки нет, а в старом скрипте просто перестраховались.
Ответить

Аноним
0
# 2709
(23:44:44  18.09.2015 г.)

Здравствуйте!
При повторном обновлении текущей страницы где выводится, например, online.php, записи просто дублируются. То есть одни и те же данные по несколько раз. Как исправить?
Ответить

Administrator
0
# 2710
(15:14:22  19.09.2015 г.)

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

Аноним
2
# 2711
(02:08:06  20.09.2015 г.)

Ну тогда нужно хотя бы сделать так:
При повторном обновлении чтобы старая запись удалялась, то остается смысл использовать этот скрипт, иначе как-то странно все получается. Просто путаница...
Ответить

Administrator
0
# 2712
(14:48:52  20.09.2015 г.)

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

Аноним
0
# 2713
(19:34:21  20.09.2015 г.)

Ну тогда сделать нужно так, чтобы предыдущие ненужные на мой взгляд записи удалялись. Тогда будет даже отлично и комфортно.
Ответить

Алексей
0
# 3168
(12:07:43  12.04.2016 г.)

Как скорректировать время в лог файле, если оно меньше на три часа?
Ответить

Administrator
0
# 3170
(19:36:05  12.04.2016 г.)

Замените date("H:i:s d.m") на date("H:i:s d.m",time()+10800)
Ответить

Игорь
0
# 3792
(15:43:59  18.03.2017 г.)

Можно проще: добавить часовой пояс
ini_set('date.timezone', 'Europe/Kiev');
Ответить

Вячеслав
0
# 3232
(04:07:41  24.05.2016 г.)

Здравствуйте!
Скажите, пожалуйста, а как же быть, если будет пару тысяч записей, как же они все покажутся на странице? Есть что-то типа вроде пагинации?
Остальная часть комментария, как и последующие два перенесены на форум.
Ответить

Дмитрий
0
# 3626
(04:47:42  17.12.2016 г.)

Прошу помочь! Не работает скрипт.
Сначала не понял в чем дело, потом включил отображение ошибок и он выдал мне это:
$col_zap) array_shift($lines);$l_cash=implode("\n",$lines);...
Ответить

Administrator
0
# 3627
(13:48:24  17.12.2016 г.)

У Вас PHP код отображается как текст. Возможно, Ваш хостинг не поддерживает PHP, либо Вы не туда добавляете код.
Ответить

GeoGraph
0
# 3890
(22:47:13  14.05.2017 г.)

Можно, как предлагали выше, добавить определение страны через бесплатные базы от Sypex Geo, путем добавления кода:

//определяем код страны, из которой пришел посетитель:
include("sxgeo/SxGeo.php");//включаем апи Sypex для определения места положения юзера
$ip= $_SERVER['REMOTE_ADDR'];//получаем ip юзера
$SxGeo = new SxGeo('sxgeo/SxGeo.dat');//создаем новый объект, если используется база sxgeo.dat
$country = $SxGeo->getCountry($ip);//получаем из базы Sypex код страны по известному ip
unset($SxGeo);//освобождаем ресурсы сервера

при этом в $country получим iso код страны, который нужно дописать в базу, например:

$l_cash.=date("d.m.y")."|".date("H:i:s")."|".$bot."|".$ip."|".$country"\n";

Сам подключаемый скрипт базами стран, скачать у Sypex и положить в папку: sxgeo/SxGeo.php , тогда все стандартно сработает. Не забудьте, конечно же добавить еще одно поле для вывода $country во втором файле.
Ответить

Андрей
0
# 3950
(16:01:37  15.06.2017 г.)

Здравствуйте, подскажите пожалуйста, что изменить в коде чтобы запись в файл велась с конца, то есть чтобы новые посетители отображались с начала файла, я вывожу это через Smarty, поэтому с этим проблемы?
$ip = getRealIpAddr();
$date = date("d.m.Y H:i"); // определяем дату и время события
$home = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // определяем страницу сайта
$ref = $_SERVER["HTTP_REFERER"];
$lines = file($file);
while(count($lines) > $col_zap) array_shift($lines);
$lines[] = $ip." » ".$date." | ".$home." | ".$ref." |".$bot."\r\n";
file_put_contents($file, $lines);
Ответить

Рубен
0
# 3994
(12:09:40  01.07.2017 г.)

Сделал все как по инструкции, добавлял код на страницу разными способами, ничего не работает, логи не появляются, файл статистики выдает ошибку отсутствия файла, пишет что ботов ноль и онлайн 3, причем эту же информацию он выдает если удалить основной код php из страницы, помогите разобраться.
Ответить

Рубен
0
# 4006
(20:02:25  01.07.2017 г.)

Все! разобрался, я почти ничего не знаю про php, забыл что если добавить php код то надо расширение html на php поменять, все работает, спасибо!
Ответить

Павел
0
# 4132
(20:30:09  14.11.2017 г.)

Отличный скрипт жаль что не сохраняет логи других папок...
Скрипт сохраняет записи только с корня сайта а вот такие запроси не сохраняются например: site.ru/forum/them.php?id=1
Ответить

Administrator
0
# 4133
(22:52:46  14.11.2017 г.)

Очень странно, что у Вас не сохраняет, т.к. используется элемент $_SERVER['REQUEST_URI'] который содержит имя скрипта, начиная от корневой директории виртуального хоста и параметры. Возможно у Вас в .htaccess настроен редирект, поэтому так и происходит.
Ответить

Анастасия
0
# 4167
(22:01:56  04.12.2017 г.)

Добрый вечер! Сделала всё по инструкции - добавила код на главную страницу index.html, в этом же каталоге создала файл logi.php, но при его просмотре выдает ошибку "Warning: file_get_contents(base_user) [function.file-get-contents]: failed to open stream: No such file or directory in...", а в таблице вместо русского языка сплошные кракозябры (понимаю, кодировка, но что с этим делать?)
Подскажите, пожалуйста, что не так?
Заранее спасибо за ответ!
Ответить

Administrator
0
# 4168
(22:51:42  04.12.2017 г.)

Прокручиваем страничку вверх и читаем первые комментарии :)
Ответить

Анастасия
0
# 4169
(23:47:59  04.12.2017 г.)

Спасибо за ответ, но я первым делом их все и прочитала...)))
С кракозябрами проблему решила (стыдно даже за вопрос)))
В коде пыталась менять путь на полное имя файла (скопировала его из названия файла, которое видно при редактировании), но ошибка никуда не делась...
Ответить

Administrator
0
# 4170
(00:18:04  05.12.2017 г.)

"Warning: file_get_contents(base_user) ..."
Похоже, что в кавычки забыли взять base_user.
Ответить

Анастасия
0
# 4172
(00:26:46  05.12.2017 г.)

Проверила, кавычки на месте.
Вот ошибка целиком
Warning: file_get_contents(base_user) [function.file-get-contents]: failed to open stream: No such file or directory in /var/www/vhosts/...ru/httpdocs/...ru/nashi_logi.php on line 3
Ответить

Administrator
0
# 4174
(21:25:54  05.12.2017 г.)

Так у Вас файла base_user по указанному пути нет. Либо логи в файл не пишутся, либо файл base_user лежит в какой-нибудь другой папке.
Ответить

Владимир
0
# 4189
(22:27:57  13.12.2017 г.)

Все отлично работает, просто чудесно. Но вот одна когда я захожу на сайт с телефона или планшета (на всех разная симка), то он мне выдает американский IP, прокси. Но когда я с телефона или планшета захожу на сайты такие как: 2ip.ru или internet.yandex.ru он показывает нормальный IP, мой то есть. Это можно как-нибудь исправить? Что бы настоящий IP показывал? Или это мой интернет так старается? Кстати, через компьютер когда захожу, то все норм, показывает мой настоящий IP.
Ответить

Сергей
0
# 4252
(19:58:04  27.02.2018 г.)

Вопрос можно ли файл base_bot хранить в другой директории на сайте недоступной через Инет, или сделать еще что-то чтобы не все пользователи инета могли его прочитать?
Ответить

Андрей К.
0
# 4368
(12:01:05  11.11.2018 г.)

Здравствуйте, подскажите пожалуйста можно ли модифицировать данный скрипт для изначального вывода уникальных IP-адресов с сортировкой по последнему посещению и их подсчетом, а уже потом по запросу конкретного IP организовать вывод полной информации о посещении сделанной данным пользователем.
Ответить

Administrator
0
# 4370
(14:04:50  11.11.2018 г.)

Модифицировать данный скрипт для такой задачи будет не совсем целесообразно, т.к. гораздо проще это сделать с использованием MySQL, а данный скрипт изначально создавался для владельцев бесплатных хостингов без поддержки MySQL.
Ответить

Андрей К.
0
# 4371
(15:48:28  11.11.2018 г.)

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

nik
0
# 4519
(13:59:12  07.10.2019 г.)

А как сделать красным цвет IP?
Ответить

Administrator
0
# 4520
(15:16:17  07.10.2019 г.)

За вывод IP отвечает строчка: echo '<td class="zz">'.$str[2].'</td>';
Сделайте, например, так: echo '<td class="zz"><span style="color: #FF0000;">'.$str[2].'</span></td>';
Ответить

nik
0
# 4521
(17:01:33  07.10.2019 г.)

Спасибо за оперативность все получилось. И еще можно ли организовать колонку с порядковым номером заходов текущего ай пи адреса?
Ответить

debi
0
# 4531
(14:57:56  24.10.2019 г.)

Здравствуйте. Спасибо большое за скрипт.
Возможно ли в главном логе добавить отображение количества строк в файле base_bot?
Ответить

Administrator
0
# 4532
(15:32:21  24.10.2019 г.)

Возможно. Количество строк находится в переменной $size_f. Но стоит учитывать, что при достижении количества строк значению, указанному в переменной $col_zap, старые строки будут удаляться из файла и количество строк всегда будет равно значению, указанному в $col_zap.
Ответить

Артем
0
# 4644
(13:40:16  04.05.2020 г.)

Здравствуйте, у меня после строк
while(count($lines)>$col_zap) array_shift($lines);
$l_cash=implode("\n",$lines);
начинает отображаться на сайте строки кода $col_zap) array_shift($lines);
$l_cash=implode("\n",$lines); и далее до конца, в чем может быть причина
Ответить

Administrator
0
# 4645
(22:18:57  05.05.2020 г.)

Вероятно, по какой-то причине знак ">" распознается движком Вашего сайта как закрывающий тег php "?>".
Ответить

Василий
0
# 4889
(20:27:16  26.01.2022 г.)

Подскажите, пожалуйста, как сделать так чтоб мой IP не писался, ну или же отнести его в файл к ботам.

И второй вопрос как сделать еще колонку где бы считалось количество посещений одним IP адресом.
Спасибо.
Ответить

Закрыть
Ваше имя:
308 + 3 =
Добавить комментарий:
Ваше имя:
308 + 3 =

Перед публикацией все комментарии проходят обязательную модерацию!

Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Посетителей онлайн: 7

Как Вы узнали о нашем сайте?