262 lines
13 KiB
PHP
262 lines
13 KiB
PHP
|
<? // WR-Counter v 1.3 // 24.07.12 г. // Miha-ingener@yandex.ru
|
|||
|
|
|||
|
#error_reporting (E_ALL);
|
|||
|
|
|||
|
include "config.php";
|
|||
|
|
|||
|
function prcmp ($a, $b) {if ($a==$b) return 0; if ($a<$b) return -1; return 1;}
|
|||
|
$months=array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь");
|
|||
|
$weeks=array("Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота");
|
|||
|
$deldt=time()-$days*86400; // формируем дату удаления файлов статистики
|
|||
|
|
|||
|
|
|||
|
function replacer ($text) { // ФУНКЦИЯ очистки кода
|
|||
|
$text=str_replace(" ",' ',$text);
|
|||
|
$text=str_replace(">",'>',$text);
|
|||
|
$text=str_replace("<",'<',$text);
|
|||
|
$text=str_replace("\"",'"',$text);
|
|||
|
$text=preg_replace("/\n\n/",'<p>',$text);
|
|||
|
$text=preg_replace("/\n/",'<br>',$text);
|
|||
|
$text=preg_replace("/\\\$/",'$',$text);
|
|||
|
$text=preg_replace("/\r/",'',$text);
|
|||
|
$text=preg_replace("/\\\/",'\',$text);
|
|||
|
$text=str_replace("\r\n","<br> ",$text);
|
|||
|
$text=str_replace("\n\n",'<p>',$text);
|
|||
|
$text=str_replace("\n",'<br> ',$text);
|
|||
|
$text=str_replace("\t",'',$text);
|
|||
|
$text=str_replace("\r",'',$text);
|
|||
|
$text=str_replace(' ',' ',$text);
|
|||
|
return $text; }
|
|||
|
|
|||
|
|
|||
|
if (is_file("$datadir/mainbase.dat")) $ftime=filemtime("$datadir/mainbase.dat")+300; else $ftime=0; // + 5 минут
|
|||
|
$tektime=time();
|
|||
|
|
|||
|
if ($ftime<$tektime) { // Если дата создания файла mainbase.dat менее 5 минут назад, статистику НЕ ПЕРЕСТРАИВАЕМ!
|
|||
|
|
|||
|
$i=0; if ($handle = opendir($datadir)) {
|
|||
|
while (($file = readdir($handle)) !== false)
|
|||
|
if (!is_dir($file)) {$records[$i]=$file; $i++;}
|
|||
|
closedir($handle);
|
|||
|
} else print 'В папке, которую вы указали нет данных счётчика!';
|
|||
|
$itogo=count($records); $k=0; $text=null;
|
|||
|
|
|||
|
|
|||
|
do {
|
|||
|
$fline=file("$datadir/$records[$k]"); $fitogo=count($fline);
|
|||
|
|
|||
|
if ($fitogo!=0 and $records[$k]!="all.dat" and $records[$k]!="last.dat" and $records[$k]!="mainbase.dat" and $records[$k]!=".htaccess")
|
|||
|
{
|
|||
|
$thendayx=str_replace(".dat","",$records[$k]);
|
|||
|
$dt=explode(".",$thendayx);
|
|||
|
$then=mktime(0,0,0,$dt[1],$dt[0],$dt[2]);
|
|||
|
$tekdate=date("d.m.Y",$then);
|
|||
|
|
|||
|
if ($deldt>$then) unlink ("$datadir/$records[$k]"); // Удаляем статистику позднее $maxdays (XX дней, указано в админке)
|
|||
|
|
|||
|
// Блок считает ХОСТЫ (уникальных посетителей)
|
|||
|
usort($fline,"prcmp"); $numip="0"; $hi=0; $ab="0"; $ac="0";
|
|||
|
|
|||
|
do { $dt=explode("|",$fline[$hi]);
|
|||
|
if ($ab!=$dt[0]) {$ab=$dt[0]; $numip++;}
|
|||
|
$hi++; } while ($hi<$fitogo);
|
|||
|
|
|||
|
$text.="$then|$fitogo|$numip||$records[$k]|\r\n";
|
|||
|
}
|
|||
|
unset($fitogo);
|
|||
|
unset($fline);
|
|||
|
$k++;
|
|||
|
} while ($k<$itogo);
|
|||
|
|
|||
|
$fp=fopen("$datadir/mainbase.dat","w");
|
|||
|
flock ($fp,LOCK_EX);
|
|||
|
fputs($fp,"$text");
|
|||
|
fflush ($fp);//очищение файлового буфера
|
|||
|
flock ($fp,LOCK_UN);
|
|||
|
fclose($fp);
|
|||
|
@chmod("$datadir/mainbase.dat", 0644);
|
|||
|
|
|||
|
} // if ($ftime<$tektime)
|
|||
|
|
|||
|
// сортируем данные
|
|||
|
$records=file("$datadir/mainbase.dat"); $maxi=count($records); usort($records,"prcmp");
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (isset($_GET['day'])) { $day=$_GET['day']; // ПРОСМОТР СТАТИСТИКИ ЗА СУТКИ (по каждой странице)
|
|||
|
|
|||
|
if (strlen($day)<12 and ctype_digit($day)) {
|
|||
|
$file=date("d.m.Y",$day);
|
|||
|
if (is_file("data/$file.dat")) { $records=file("data/$file.dat"); $maxi=count($records); $hitov=$maxi;
|
|||
|
|
|||
|
if (isset($_POST['findme'])) {
|
|||
|
$findme=replacer($_POST['findme']);
|
|||
|
$stroka=strlen($findme); if($stroka>2 and $stroka<30) {
|
|||
|
$temprecord=$records; $records=null; $i=0; $hitov=count($temprecord);
|
|||
|
foreach($temprecord as $v) {if (strpos($v,$findme)) {$i++; $records[$i]=$v;}}
|
|||
|
$maxi=$i; $hitov="$hitov / $maxi";}} else $findme="";
|
|||
|
|
|||
|
// Блок считает ХОСТЫ (уникальных посетителей)
|
|||
|
usort($records,"prcmp");
|
|||
|
$numip=0; $numsys=0; $i=0; $ab="0"; $ac="0"; $ad="0"; $newlines=null;
|
|||
|
|
|||
|
do { $dt=explode("|",$records[$i]); $newlines[$i]="$dt[4]"; $i++; } while ($i<$maxi);
|
|||
|
usort($newlines,"prcmp"); $i=0; // Сортируем все просмотренные страницы
|
|||
|
|
|||
|
do { $dt=explode("|",$records[$i]);
|
|||
|
if ($ab!=$dt[0]) {$ab=$dt[0]; $numip++;}
|
|||
|
if ($ad!=$newlines[$i]) {$ad=$newlines[$i]; $numsys++;}
|
|||
|
$i++; } while ($i<$maxi);
|
|||
|
|
|||
|
$i=1; $msg=""; // Собираем информацию о посещаемых страницах
|
|||
|
|
|||
|
$newlines2=array_count_values($newlines); // считаем кол-во посещений каждой страницы
|
|||
|
arsort($newlines2); reset($newlines2);
|
|||
|
|
|||
|
do {
|
|||
|
$massiv=each($newlines2);
|
|||
|
$m2=round($massiv[1]*$scale1*5);
|
|||
|
$delta=100*$massiv[1]/$maxi;
|
|||
|
if ($delta>2) $addstyle="bgcolor=#E6FFE6"; else $addstyle="";
|
|||
|
if ($delta>5) $addstyle="bgcolor=#CAFFCA";
|
|||
|
if ($delta>10) $addstyle="bgcolor=#64FF64";
|
|||
|
$procent=round($delta,1); $procent="($procent %)";
|
|||
|
if (strlen($massiv[0])<1) $massiv[0]="СТРАНИЦА НЕ РАСПОЗНАНА";
|
|||
|
|
|||
|
$msg.="<TR $addstyle><TD align=center>$i</TD><TD>";
|
|||
|
$hrtext=$massiv[0]; if (strlen($massiv[0])>70) { $hrtext=substr($hrtext,0,70); $hrtext.="...";}
|
|||
|
if ($massiv[1]>1 and $massiv[0]!="СТРАНИЦА НЕ РАСПОЗНАНА") $msg.="<a href='$massiv[0]'>$hrtext</a>"; else $msg.="$hrtext";
|
|||
|
$msg.="</td><td><img src='images/g1.gif' width=$m2 height=16 border=0> <B>$massiv[1]</B> $procent</TD></TR>"; $i++; } while ($i<=count($newlines2));
|
|||
|
|
|||
|
$dayn=date("w",$day); // Считаваем день недели по порядку
|
|||
|
$lastday1=date("d.m.Y",$day-86400); $lastday2=$day-86400;
|
|||
|
$nextday1=date("d.m.Y",$day+86400);$nextday2=$day+86400;
|
|||
|
print"<center>
|
|||
|
<table align=center border=0><TR>
|
|||
|
<TD align=center bgcolor=#F2F2F2><a href='info.php?day=$lastday2'><--<br> Предыдущая дата:<br>$lastday1 г.</a></TD>
|
|||
|
<TD><center>Дата: <B>$file</B> г.<br><B>";
|
|||
|
if ($dayn!=0 and $dayn!=6) print"$weeks[$dayn]"; else print "<font color=red>$weeks[$dayn]</font>";
|
|||
|
print"</B><br>
|
|||
|
Итого хитов: <font size=+2><B>$hitov</B></font><br>
|
|||
|
Итого хостов: <font size=+2><B>$numip</B></font><br>
|
|||
|
Уникальных страниц: <font size=+2><B>$numsys</B></font></TD>
|
|||
|
|
|||
|
<TD align=center bgcolor=#F2F2F2><a href='info.php?day=$nextday2'>Следующая дата:<br>$nextday1 г.<br> --></a></TD>
|
|||
|
</TR></TABLE><br>
|
|||
|
|
|||
|
<a href='info.php'>Вернуться на страницу статистики</a><br><br>
|
|||
|
|
|||
|
<div align=right><form action='info.php?day=$day' method=POST name=finder>
|
|||
|
Фильтр по страницам: <input name='findme' value='$findme' class=post type='text' maxlength=50 size=20>
|
|||
|
<input type=submit value='Искать'>
|
|||
|
</form></div>
|
|||
|
|
|||
|
<table border=0 cellSpacing=0 cellPadding=0 align=center>
|
|||
|
<TR align=center><TD>№ п/п</TD><TD>Страница</TD><TD>Просмотров *</TD></TR>
|
|||
|
$msg
|
|||
|
</table>
|
|||
|
</center>";
|
|||
|
} else print"Статистики посещений за указанный Вами день нет.";// if is_file
|
|||
|
}
|
|||
|
|
|||
|
echo'<br><small>* При использовании поиска количество хостов, уникальных страниц, а также процент считается от<br>
|
|||
|
того количества страниц, которое попало под фильтр, а не от общего количества страниц!</small>';
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
} else { // if isset($day). ИНАЧЕ показываем общую страницу статистики
|
|||
|
|
|||
|
|
|||
|
|
|||
|
print"<HTML><head><META content='text/html; charset=windows-1251' http-equiv=Content-Type><title>Информация по посещаемости сайта</title><meta name=\"Robots\" content=\"noindex,npfollow\"></head>
|
|||
|
<BODY text=#000000 leftMargin=0 topMargin=0 rightMargin=0 bottomMargin=0 marginheight=0 marginwidth=0><center>
|
|||
|
<B>Информация по посещаемости</B> *<TABLE cellSpacing=0 cellPadding=0 width=\"98%\"><TR><TD valign=top>";
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if (sizeof($records)>=1) { // ЕСЛИ есть данные - то выводим графики
|
|||
|
|
|||
|
if ($gtype=="1") { $itogohit=0; $itogohost=0; // ГОРИЗОНТАЛЬНЫЙ график
|
|||
|
|
|||
|
$xdaym="</TR><TR><TD align=center><small>Дата</TD><TD> </TD>\r\n "; $graph1=""; $graph2=""; // Формируем данные для графиков
|
|||
|
$g1shapka="<table border=0 cellSpacing=0 cellPadding=0 align=center><tr align=center valign=bottom><TD valign=middle><small>К<BR>О<BR>Л<BR>-<BR>В<BR>О<BR><B><BR>Х<BR>И<BR>Т<BR>О<BR>В</TD><TD><img src='images/v1scale.gif' border=0></TD>\r\n";
|
|||
|
$g2shapka="<table border=0 cellSpacing=0 cellPadding=0 align=center><tr align=center valign=bottom><TD valign=middle><small>К<BR>О<BR>Л<BR>-<BR>В<BR>О<BR><B><BR>Х<BR>О<BR>С<BR>Т<BR>О<BR>В</TD><TD><img src='images/v2scale.gif' border=0></TD>\r\n";
|
|||
|
|
|||
|
|
|||
|
|
|||
|
for ($i=0; $i<$maxi; $i++) { // начало FOR
|
|||
|
$dtt=explode("|",$records[$i]);
|
|||
|
|
|||
|
$dttn1=round($dtt[1]*$scale1); // шкала 1-го графика
|
|||
|
$dttn2=round($dtt[2]*$scale2); // шкала 2-го графика
|
|||
|
$itogohit=$itogohit+$dtt[1];
|
|||
|
$itogohost=$itogohost+$dtt[2];
|
|||
|
|
|||
|
$graph1.="<TD><table cellSpacing=0 cellPadding=0><TR><TD width=24 align=center><small>$dtt[1]</small></TD></TR><TR><TD align=center><img src='images/v1.gif' height=$dttn1 width=20></TD></TR></TABLE></td>\r\n";
|
|||
|
$graph2.="<TD><table cellSpacing=0 cellPadding=0><TR><TD width=24 align=center><small>$dtt[2]</small></TD></TR><TR><TD align=center><img src='images/v2.gif' height=$dttn2 width=20></TD></TR></TABLE></td>\r\n";
|
|||
|
|
|||
|
if (!isset($m0)) {$m0=date("m",$dtt[0])-1;}
|
|||
|
if ($i==$maxi-1) {$m1=date("m",$dtt[0])-1;}
|
|||
|
$xday=date("d",$dtt[0]);
|
|||
|
$dayn=date("w",$dtt[0]); // Считаваем день недели по порядку
|
|||
|
if ($dayn=="0" or $dayn=="6") $weekstyle="bgcolor=#FF7979"; else $weekstyle="";
|
|||
|
$xdaym.="<td $weekstyle align=center><small><a href='info.php?day=$dtt[0]'>$xday</a></small></TD>\r\n";
|
|||
|
} // конец FOR
|
|||
|
|
|||
|
$xdaym.="<td width=100 align=center> </TD><td align=center><small>ИТОГО</small></TD>";
|
|||
|
$graph1.="<td align=center> </TD><TD><table cellSpacing=0 cellPadding=0><TR><TD width=24 align=center><small>$itogohit</small></TD></TR><TR><TD align=center><img src='images/v1.gif' height=230 width=20></TD></TR></TABLE></td>\r\n";
|
|||
|
$graph2.="<td align=center> </TD><TD><table cellSpacing=0 cellPadding=0><TR><TD width=24 align=center><small>$itogohost</small></TD></TR><TR><TD align=center><img src='images/v2.gif' height=230 width=20></TD></TR></TABLE></td>\r\n";
|
|||
|
|
|||
|
$mm1=$months[$m0]; $mm2=$months[$m1]; if ($mm1==$mm2) {$mm1="";} else {$mm1.=" - ";}
|
|||
|
$msdat="</TR></TABLE><center>Период: <B>$mm1 $mm2</B> ($days дн.)</center>\r\n";
|
|||
|
|
|||
|
print"$g1shapka $graph1 $xdaym </TR></TABLE>"; // печатаем 1-ый ГРАФИК
|
|||
|
print"$g2shapka $graph2 $xdaym $msdat"; // печатаем 2-ой ГРАФИК
|
|||
|
|
|||
|
|
|||
|
} else { // ВЕРТИКАЛЬНЫЙ график
|
|||
|
|
|||
|
|
|||
|
$g1shapka="<table cellSpacing=0 cellPadding=0 align=center><tr align=center valign=bottom><TD valign=middle><small>Дата</TD><TD>КОЛ-ВО <B>ХИТОВ</TD></TR><TR><TD> </TD><TD><img src='images/g1scale.gif' border=0></TD>\r\n";
|
|||
|
$g2shapka="<table cellSpacing=0 cellPadding=0 align=center><tr align=center valign=bottom><TD valign=middle><small>Дата</TD><TD>КОЛ-ВО <B>ХОСТОВ</TD></TR><TR><TD> </TD><TD><img src='images/g2scale.gif' border=0></TD>\r\n";
|
|||
|
$xdaym=""; $graph1=""; $graph2=""; // Формируем данные для графиков
|
|||
|
|
|||
|
for ($i=0; $i<$maxi; $i++) { // начало FOR
|
|||
|
$dtt=explode("|",$records[$i]);
|
|||
|
|
|||
|
//$dtt[0]=date("d.m.y",$dtt[0]);
|
|||
|
if (!isset($m0)) {$m0=date("m",$dtt[0])-1;}
|
|||
|
if ($i==$maxi-1) {$m1=date("m",$dtt[0])-1;}
|
|||
|
$xday=date("d",$dtt[0]);
|
|||
|
|
|||
|
$dttn1=round($dtt[1]*$scale1); // шкала 1-го графика
|
|||
|
$dttn2=round($dtt[2]*$scale2); // шкала 2-го графика
|
|||
|
|
|||
|
$graph1.="<tr><TD align=center><small>$xday</small></TD><td><table cellSpacing=0 cellPadding=0><TR><TD><img src='images/g1.gif' height=16 width=$dttn1></TD><TD align=center> <small>$dtt[1]</small></TD></TR></TABLE></td></tr>";
|
|||
|
$graph2.="<tr><TD align=center><small>$xday</small></TD><td><table cellSpacing=0 cellPadding=0><TR><TD><img src='images/g2.gif' height=16 width=$dttn2></TD><TD align=center> <small>$dtt[2]</small></TD></TR></TABLE></td></tr>";
|
|||
|
|
|||
|
} // конец FOR
|
|||
|
|
|||
|
|
|||
|
$mm1=$months[$m0]; $mm2=$months[$m1]; if ($mm1==$mm2) {$mm1="";} else {$mm1.=" - ";}
|
|||
|
$msdat="</tr><TR><TD colspan=2><center><small>Период:</small> <B>$mm1 $mm2</B></center>\r\n";
|
|||
|
|
|||
|
print"<BR>$g1shapka $graph1 $xdaym </TR></TABLE></TD><TD width='50%' valign=top> <!-- Делим экран пополам -->"; // печатаем 1-ый ГРАФИК
|
|||
|
print"<BR>$g2shapka $graph2 $xdaym </TR></TABLE></TD>$msdat<BR>"; // печатаем 2-ой ГРАФИК
|
|||
|
|
|||
|
|
|||
|
} // else ($gtype)
|
|||
|
|
|||
|
print"</center><small>P.S. <B>Хиты</B> - общее количество просмотров страниц где установлен счётчик;<BR>
|
|||
|
<B>Хосты</B> - количество посетителей с уникальным IP-адресом.<BR>
|
|||
|
Статистика обновляется каждые 5 минут. Следующее обновление в ". date("H:i:s",$ftime)."</small>";
|
|||
|
|
|||
|
} else {print"<center><br><br>Данные для графика отсутствуют.<br> Посещений за последний период не было.<br><br>";}
|
|||
|
|
|||
|
} // else от if isset($day)
|
|||
|
|
|||
|
?>
|
|||
|
</TD></TR></table>
|
|||
|
</body></html>
|