PHP

Графический счетчик

Этот счетчик по-сути является комбинацией счетчика посетителей и просмотров с ежедневной почасовой статистикой, вывод - графический, суммарное число просмотров (от начала функционирования счетчика), число просмотров и посетителей за текущие сутки прописывается на картинке. Ну и, естественно, уже описанные функции подробно не разбираются. Код счетчика:

<?php
function ini_stat(){
if(!file_exists("stat/hit".date('d-m').".hit")){clear_hit();}
if(!file_exists("stat/hst".date('d-m').".hst")){clear_hst();}
if(file_exists("stat/hit".date('d-m').".hit")&file_exists("stat/hst".date('d-m').".hst"))$ready=TRUE;
return $ready;
}

function ini(){
if(!file_exists("stat")){mkdir("stat");}
if(!file_exists("imgc")){mkdir("imgc");}
if(!file_exists("stat/hit")){mkdir("stat/hit");}
if(!file_exists("stat/hst")){mkdir("stat/hst");}
if(file_exists("stat")&file_exists("stat/hit")&file_exists("stat/hst"))$ready=TRUE;
return $ready;
}

function clear_hst(){
$df=fopen("stat/hst/".date('d-m').".hst","w");
for($i=0;$i<24;$i++){$dtrn=$dtrn."0|";}
fputs($df,$dtrn);
fclose($df);}

function clear_hit(){
$df=fopen("stat/hit/".date('d-m').".hit","w");
for($i=0;$i<24;$i++){$dtrn=$dtrn."0|";}
fputs($df,$dtrn);
fclose($df);}

if(!ini())ini_stat();

$ip=getenv("REMOTE_ADDR");

$date=date(d.m.Y,time());


$datetime=date("d-m-y G.i:s", time());

$fip = @fopen ("stat/ip.txt", "r");

$data = @fread ($fip, filesize("stat/ip.txt"));

@fclose ($fip);

$f = @fopen ("stat/counter.txt", "r");

$counts = @fread ($f, filesize("stat/counter.txt"));

@fclose ($f);

list($d,$all,$hits,$hsts)=explode("|",$counts);
if ($d!=$date)
{
clear_hst();
clear_hit();

$d=$date;

$hits=0;

$hsts=0;

$clsip=fopen("stat/ip.txt","w+");

fputs($clsip,"");

fclose($clsip);
}

$h=intval(date('H'));
if (!stristr($data,$ip))
{
$fip=@fopen("stat/ip.txt","a");
fputs($fip,$ip."
");
@fclose($fip);
$all++;
$hits++;
$hsts++;

$dtf=@file_get_contents("stat/hst/".date('d-m').".hst");
$dtr=explode("|",$dtf);

$df=@fopen("stat/hst/".date('d-m').".hst","w+");
$dtr[$h]++;
$dtrn=implode("|",$dtr);
fputs($df,$dtrn);
@fclose($df);
$dt=$dtr;

}
else
{
$all++;
$hits++;
}
$dtf=@file_get_contents("stat/hit/".date('d-m').".hit");
$dtr=explode("|",$dtf);
$df=@fopen("stat/hit/".date('d-m').".hit","w+");
$dtr[$h]++;
$dtrn=implode("|",$dtr);
fputs($df,$dtrn);
@fclose($df);
$dt=$dtr;

$fc=@fopen("stat/counter.txt","w+");

fputs($fc,$d."|".$all."|".$hits."|".$hsts);
@fclose($fc);

$img=imagecreatefromjpeg("counter.jpg");
$white = imageColorAllocate($img, 255, 255, 255);
imagestring($img, 1, 75-strlen($all)*5, 3, $all, $white);
imagestring($img, 1, 75-strlen($hits)*5, 13, $hits, $white);
imagestring($img, 1, 75-strlen($hsts)*5, 23, $hsts, $white);
imagejpeg($img,"imgc/count.jpg");
echo "<img src='imgc/count.jpg'>";
?>

Как обычно, первым идет блок функций. Функция ini_stat() готовит файлы статистики к записи - если их нет, то создает их и размечает функциями clear_hit() и clear_hst():

function ini_stat(){
if(!file_exists("stat/hit".date('d-m').".hit")){clear_hit();}
if(!file_exists("stat/hst".date('d-m').".hst")){clear_hst();}
if(file_exists("stat/hit".date('d-m').".hit")&file_exists("stat/hst".date('d-m').".hst"))$ready=TRUE;
return $ready;
}

Функция ini() создает все необходимые для работы счетчика директории:

function ini(){
if(!file_exists("stat")){mkdir("stat");}
if(!file_exists("imgc")){mkdir("imgc");}
if(!file_exists("stat/hit")){mkdir("stat/hit");}
if(!file_exists("stat/hst")){mkdir("stat/hst");}
if(file_exists("stat")&file_exists("stat/hit")&file_exists("stat/hst"))$ready=TRUE;
return $ready;
}

Уже упоминавшиеся функции clear_hit() и clear_hst() создают и размечают файлы статистики посетителей и просмотров:

function clear_hst(){
$df=fopen("stat/hst/".date('d-m').".hst","w");
for($i=0;$i<24;$i++){$dtrn=$dtrn."0|";}
fputs($df,$dtrn);
fclose($df);}

function clear_hit(){
$df=fopen("stat/hit/".date('d-m').".hit","w");
for($i=0;$i<24;$i++){$dtrn=$dtrn."0|";}
fputs($df,$dtrn);
fclose($df);}

Основной блок. Начнем с того, что если отсутствуют директории и файлы статистики, то необходимо их создать:

if(!ini())ini_stat();

Следующий фрагмент - как в разобранном раньше счетчике посетителей:

$ip=getenv("REMOTE_ADDR");

$date=date(d.m.Y,time());


$datetime=date("d-m-y G.i:s", time());

$fip = @fopen ("stat/ip.txt", "r");

$data = @fread ($fip, filesize("stat/ip.txt"));

@fclose ($fip);

$f = @fopen ("stat/counter.txt", "r");

$counts = @fread ($f, filesize("stat/counter.txt"));

@fclose ($f);

list($d,$all,$hits,$hsts)=explode("|",$counts);

При наступлении следующего дня или Нового года обнуляем счетчики посетителей и просмотров и готовим чистые бланки на следующий день:

if ($d!=$date)
{
clear_hst();
clear_hit();

$d=$date;

$hits=0;

$hsts=0;

$clsip=fopen("stat/ip.txt","w+");

fputs($clsip,"");

fclose($clsip);
}

Дальше - как в счетчике со статистикой, только статистику ведем и для просмотров, и для посетителей. Если посетитель нам еще не попадался, вписываем его в файл в число посетителей за текущий час:

$h=intval(date('H'));
if (!stristr($data,$ip))
{
$fip=@fopen("stat/ip.txt","a");
fputs($fip,$ip."
");
@fclose($fip);
$all++;
$hits++;
$hsts++;

$dtf=@file_get_contents("stat/hst/".date('d-m').".hst");
$dtr=explode("|",$dtf);

$df=@fopen("stat/hst/".date('d-m').".hst","w+");
$dtr[$h]++;
$dtrn=implode("|",$dtr);
fputs($df,$dtrn);
@fclose($df);
$dt=$dtr;

}

Если не попадался, то записываем число просмотров в любом случае:

else
{
$all++;
$hits++;
}
$dtf=@file_get_contents("stat/hit/".date('d-m').".hit");
$dtr=explode("|",$dtf);
$df=@fopen("stat/hit/".date('d-m').".hit","w+");
$dtr[$h]++;
$dtrn=implode("|",$dtr);
fputs($df,$dtrn);
@fclose($df);
$dt=$dtr;

$fc=@fopen("stat/counter.txt","w+");

fputs($fc,$d."|".$all."|".$hits."|".$hsts);
@fclose($fc);

А вот теперь - графический вывод. Создаем рисунок из заготовки (она - в файле counter.jpg, который находится в одной папке со счетчиком). Переменная $img - идентификатор открытого рисунка:

$img=imagecreatefromjpeg("counter.jpg");

Определяем белый цвет, им мы будем рисовать цифры на картинке - цвет определяется в формате RGB функцией imageColorAllocate(идентификатор открытого рисунка, красный, зеленый, голубой):

$white = imageColorAllocate($img, 255, 255, 255);

и записываем на шаблоне счетчика общее число просмотров функцией imagestring(идентификатор рисунка, размер шрифта, х-координата, у-координата, текст, цвет):

imagestring($img, 1, 75-strlen($all)*5, 3, $all, $white);

Выражение для х-координаты нужно, чтобы выровнять числа на счетчике по правому краю. Аналогично для текущего числа просмотров и посетителей:

imagestring($img, 1, 75-strlen($hits)*5, 13, $hits, $white);
imagestring($img, 1, 75-strlen($hsts)*5, 23, $hsts, $white);

Сохраняем рисунок с нанесенными числами в уже заготовленной для него папке:

imagejpeg($img,"imgc/count.jpg");

и выводим картинку:

echo "<img src='imgc/count.jpg'>";

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

Рейтинг@Mail.ru