Главная » Полезные статьи » Язык PHP » Изменение внешнего вида счетчика в CNStats
Распечатать статью

Изменение внешнего вида счетчика в CNStats

Требования: CNStats 2.7 и выше. GD 1.0 и выше

При установке CNStats в разделе «Конфигурация — Код счетчика» Вам предлагается для размещения на сайте два типа кода:
обязательный код сбора статистики сайта — именно он считает посетителей сайта;
опциональный код отображения счетчика — этот код просто рисует картинку с цифрами посещений — графический счетчик.

Внешний вид счетчика который отображает текущие посещения сайта можно изменять. В данной статье рассматриваются варианты графического счетчика CNStats.

По умолчанию, счетчик CNStats выглядит следующим образом:

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

В конце заметки Вы можете посмотреть все виды рассматриваемых счетчиков и скачать их для использования.
Исходные данные

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

Так как CNStats может учитывает посещения роботов, то можно вывести информацию и по ним:
Роботов сегодня, вчера и всего;
Процентное отношения роботы/пользователи.

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

По умолчанию, скрипт, отображающий картинку счетчика находится в корневом каталоге CNStats и называется cnts.php (от англ. Counter-Show). Я рекомендую называть файлы ваших счетчиков подобным образом, например cnts-big.php, cnts-ttf.php и т.п.

Начнем написание кода с некоторой, стандартной «рыбы», которую должен содержать код любого счетчика CNStats:
error_reporting(E_ALL & ~E_NOTICE);

// Подключаемся к конфигурационному файлу.
include «config.php»;

// Создаем изображения, из заранее заданного шаблона.
$im=ImageCreateFromPng(«button.png»);

// Соединяемся с MySql сервером.
$CONN=@mysql_connect($STATS_CONF[«sqlhost»],
$STATS_CONF[«sqluser»],
$STATS_CONF[«sqlpassword»]);
if (mysql_errno()==0) {

// Выбираем базу данных
@mysql_select_db($STATS_CONF[«dbname»]);

if (mysql_errno()==0) {
// .. тут выполняются все необходимые действия
// по созданию изображения …
}
}

// Отправляем HTTP заголовок Content-Type
Header(«Content-type: image/png»);

// Генерируем изображения
ImagePng($im);

// Очищаем память
ImageDestroy($im);
?>

Далее этот код будет вставляться без комментариев.
Счетчик №1 — стандартный

error_reporting(E_ALL & ~E_NOTICE);
include «config.php»;

$im=ImageCreateFromPng(«button.png»);
$CONN=@mysql_connect($STATS_CONF[«sqlhost»],
$STATS_CONF[«sqluser»],
$STATS_CONF[«sqlpassword»]);
if (mysql_errno()==0) {
@mysql_select_db($STATS_CONF[«dbname»]);

if (mysql_errno()==0) {

// Выбираем данные
// t_hits — хитов всего
// hits — хитов сегодня
// hosts — хостов сегодня
$r=@mysql_query(«SELECT t_hits,hits,hosts FROM cns_counter»);

// Переносим единственную выбранную запись в ассоциативный массив
$res=@mysql_fetch_array($r,MYSQL_ASSOC);

// Освобождаем память
@mysql_free_result($r);

// Выделям необходимые цвета
$black=ImageColorAllocate($im,0,0,0);
$color=ImageColorAllocate($im,$COUNTER[«inkR»],
$COUNTER[«inkG»],
$COUNTER[«inkB»]);

// Выводим числа
ImageString($im,2,86-6*strlen($res[«t_hits»]),1,$res[«t_hits»],$color);
ImageString($im,1,85-5*strlen($res[«hits»]),13,$res[«hits»],$color);
ImageString($im,1,85-5*strlen($res[«hosts»]),20,$res[«hosts»],$color);
}
}

Header(«Content-type: image/png»);
ImagePng($im);
ImageDestroy($im);
?>

Самая интересная часть этого кода — это SQL запрос, которые выбирает отображаемые данные из таблицы:
SELECT t_hits,hits,hosts FROM cns_counter

Рассмотрим, что еще мы можем «вытащить» из таблиц CNStats, так, чтобы это практически не нагружало сервер.
SELECT hits, hosts, users,
t_hits, t_hosts, t_users,
u_hits, u_hosts,
u_t_hits, u_t_hosts
FROM cns_counter;

Здесь:
hits — хитов сегодня
hosts — хостов сегодня
users — пользователей сегодня
t_hits — хитов всего
t_hosts — хостов всего
t_users — пользователей всего
u_hits — хитов от посетителей за сегодня (исключены роботы)
u_hosts — хостов от посетителей за сегодня (исключены роботы)
u_t_hits — хитов от посетителей всего (исключены роботы)
u_t_hosts — хостов от посетителей всего (исключены роботы)
u_hits-hits — хитов от роботов за сегодня
u_hosts-hosts — хостов от роботов за сегодня
u_t_hits-t_hits — хитов от роботов всего
u_t_hosts-t_hosts — хостов от роботов всего

Помните! Роботы учитываются только при использовании «PHP-Include» и «комбинированного» счетчиков.

Ниже приведен запрос, который получает количество посетителей в данные момент находящихся на сайте (условно).
SELECT count(DISTINCT hid) as online
FROM cns_log
WHERE date>NOW() — INTERVAL 3 MINUTE;
Счетчик №2 — хитов всего, хитов сегодня, пользователей сегодня и сейчас на сайте

Как вы видите из изображения счетчика, здесь мы использовали другое базовое изображение, для того что бы уместить цифру «сейчас на сайте». (красным цветом)
error_reporting(E_ALL & ~E_NOTICE);
include «config.php»;

$im=ImageCreateFromPng(«button-tt.png»);
$CONN=@mysql_connect($STATS_CONF[«sqlhost»],
$STATS_CONF[«sqluser»],
$STATS_CONF[«sqlpassword»]);
if (mysql_errno()==0) {
@mysql_select_db($STATS_CONF[«dbname»]);

if (mysql_errno()==0) {

// Выбираем данные
// t_hits — хитов всего
// hits — хитов сегодня
// users — пользователей сегодня
$r=@mysql_query(«SELECT t_hits,hits,users FROM cns_counter»);

// Переносим единственную выбранную запись в ассоциативный массив
$res=@mysql_fetch_array($r,MYSQL_ASSOC);

// Освобождаем память
@mysql_free_result($r);

// Выделяем необходимые цвета
$black=ImageColorAllocate($im,0,0,0);
$red=ImageColorAllocate($im,255,0,0);

// Выводим числа
ImageString($im,2,3,1,$res[«t_hits»],$black);
ImageString($im,1,3,13,$res[«hits»],$black);
ImageString($im,1,3,20,$res[«users»],$black);

// Выбираем «сейчас на сайте»
$r=@mysql_query(«SELECT count(DISTINCT hid) as online
FROM cns_log
WHERE date>NOW() — INTERVAL 3 MINUTE;»);

$text=@mysql_result($r,0,0);
@mysql_free_result($r);
// Выводим «сейчас на сайте»
ImageString($im,1,80-5*strlen($text),4,$text,$red);
}
}

Header(«Content-type: image/png»);
ImagePng($im);
ImageDestroy($im);
?>
Счетчик №3 — использование True-Type шрифтов при генерации счетчиков

К сожалению, из-за того, что поддержка TrueType шрифтов установлена далеко не на всех серверах, такой счетчик не включается в дистрибутив. Жаль, очень красивый счетчик

На этом счетчике, для разнообразия, мы вывели хитов сегодня, хостов сегодня и пользователей сегодня.
error_reporting(E_ALL & ~E_NOTICE);
include «config.php»;

// Эта функция позволяет определить длину строки в пикселях
function width($text) {
$box=imagettfbbox(7, 0, FONT_TAHOMA, $text);
return($box[2]-$box[1]);
}

// Шрифт, который мы используем для вывода счетчика.
// Можно взять из C:\Windows\Fonts
define(‘FONT_TAHOMA’, ‘tahoma.ttf’);

// Внимание ! Изображение должно быть True-Color (24 бита)
$im=ImageCreateFromPng(«button-tt.png»);
$CONN=@mysql_connect($STATS_CONF[«sqlhost»],
$STATS_CONF[«sqluser»],
$STATS_CONF[«sqlpassword»]);

if (mysql_errno()==0) {
@mysql_select_db($STATS_CONF[«dbname»]);

if (mysql_errno()==0) {

// Выбираем данные
// hits — хитов сегодня
// hosts — хостов сегодня
// users — пользователей сегодня
$r=@mysql_query(«SELECT hits,hosts,users FROM cns_counter»);

// Переносим единственную выбранную запись в ассоциативный массив
$res=@mysql_fetch_array($r,MYSQL_ASSOC);

// Освобождаем память
@mysql_free_result($r);

// Выводим текст
$text = $res[«hits»];
Imagettftext($im,7, 0, 4, 10, 0x03314A, FONT_TAHOMA, $text);

$text = $res[«hosts»];
Imagettftext($im,7, 0, 4, 19, 0x03314A, FONT_TAHOMA, $text);

$text = $res[«users»];
Imagettftext($im,7, 0, 4, 28, 0x03814A, FONT_TAHOMA, $text);

$r=mysql_query(«SELECT count(DISTINCT hid) as online
FROM cns_log
WHERE date>NOW() — INTERVAL 10 MINUTE;»);
$text = mysql_result($r,0,0);
Imagettftext($im,7, 0, 80-width($text), 12, 0xC0314A, FONT_TAHOMA, $text);
}
}

ImagePng($im);
ImageDestroy($im);
?>
Счетчик №4 — хитов всего, хитов сегодня, пользователей сегодня, процент роботов

В этом примере, помимо роботов мы немного изменим внешний вид счетчика — добавим тени, и с помощью отступов сделаем числа более удобочитаемыми.
error_reporting(E_ALL & ~E_NOTICE);
include «config.php»;

// Эта функция позволяет определить длину строки в пикселях
function width($text) {
$box=imagettfbbox(7, 0, FONT_TAHOMA, $text);
return($box[2]-$box[1]);
}

// Шрифт, который мы используем для вывода счетчика.
// Можно взять из C:\Windows\Fonts
define(‘FONT_TAHOMA’, ‘tahoma.ttf’);

// Внимание ! Изображение должно быть True-Color (24 бита)
$im=ImageCreateFromPng(«button-tt.png»);

$CONN=@mysql_connect($STATS_CONF[«sqlhost»],
$STATS_CONF[«sqluser»],
$STATS_CONF[«sqlpassword»]);

if (mysql_errno()==0) {
@mysql_select_db($STATS_CONF[«dbname»]);

if (mysql_errno()==0) {

// Выбираем данные
// t_hits — хитов всего
// hits — хитов сегодня
// users — пользователей сегодня
// u_hits — хитов от посетителей
$r=@mysql_query(«SELECT t_hits,hits,users, u_hits FROM cns_counter»);

// Переносим единственную выбранную запись в ассоциативный массив
$res=@mysql_fetch_array($r,MYSQL_ASSOC);

// Освобождаем память
@mysql_free_result($r);

// Выводим текст
$text = number_format($res[«t_hits»],0,»,»,» «);
Imagettftext($im,7, 0, 5, 11, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 4, 10, 0x03314A, FONT_TAHOMA, $text);

$text = number_format($res[«hits»],0,»,»,» «);
Imagettftext($im,7, 0, 5, 20, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 4, 19, 0x04476C, FONT_TAHOMA, $text);

$text = number_format($res[«users»],0,»,»,» «);
Imagettftext($im,7, 0, 5, 29, 0xcccccc, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 4, 28, 0x04876C, FONT_TAHOMA, $text);

// Рассчитываем процентное отношение роботов
if ($res[«hits»]!=0)
$text = intval((1-$res[«u_hits»]/$res[«hits»])*100).»%»;
else
$text=»0″;

// Выводим текст
Imagettftext($im,7, 0, 80-width($text), 12, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 79-width($text), 11, 0x03804A, FONT_TAHOMA, $text);
}
}

ImagePng($im);
ImageDestroy($im);
?>
Счетчик №5 — все вместе

Этот большой счетчик является суммой всех предыдущих.
error_reporting(E_ALL & ~E_NOTICE);
include «config.php»;

// Эта функция позволяет определить длину строки в пикселях
function width($text) {
$box=imagettfbbox(7, 0, FONT_TAHOMA, $text);
return($box[2]-$box[1]);
}

// Шрифт, который мы используем для вывода счетчика.
// Можно взять из C:\Windows\Fonts
define(‘FONT_TAHOMA’, ‘tahoma.ttf’);

// Внимание ! Изображение должно быть True-Color (24 бита)
$im=ImageCreateFromPng(«button-big.png»);

$CONN=@mysql_connect($STATS_CONF[«sqlhost»],
$STATS_CONF[«sqluser»],
$STATS_CONFs[«sqlpassword»]);

if (mysql_errno()==0) {
@mysql_select_db($STATS_CONF[«dbname»]);

if (mysql_errno()==0) {

$r=@mysql_query(«SELECT t_hits,t_hosts,t_users,hits,hosts,
users,u_hits FROM cns_counter»);
$res=@mysql_fetch_array($r,MYSQL_ASSOC);
@mysql_free_result($r);

$text = number_format($res[«t_hits»],0,»,»,» «);
Imagettftext($im,7, 0, 86-width($text), 11, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 10, 0x03314A, FONT_TAHOMA, $text);

$text = number_format($res[«hits»],0,»,»,» «);
Imagettftext($im,7, 0, 86-width($text), 20, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 19, 0x0331FF, FONT_TAHOMA, $text);

$text = number_format($res[«t_hosts»],0,»,»,» «);
Imagettftext($im,7, 0, 86-width($text), 31, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 30, 0x03314A, FONT_TAHOMA, $text);

$text = number_format($res[«hosts»],0,»,»,» «);
Imagettftext($im,7, 0, 86-width($text), 40, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 39, 0x0331FF, FONT_TAHOMA, $text);

$text = number_format($res[«t_users»],0,»,»,» «);
Imagettftext($im,7, 0, 86-width($text), 51, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 50, 0x03314A, FONT_TAHOMA, $text);

$text = number_format($res[«users»],0,»,»,» «);
Imagettftext($im,7, 0, 86-width($text), 60, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 59, 0x0331FF, FONT_TAHOMA, $text);

$r=mysql_query(«SELECT count(DISTINCT hid) as online
FROM cns_log
WHERE date>NOW() — INTERVAL 3 MINUTE;»);
$text = mysql_result($r,0,0);
Imagettftext($im,7, 0, 86-width($text), 70, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 69, 0xC0314A, FONT_TAHOMA, $text);

$text = sprintf(«%.2f%%»,(1-$res[«u_hits»]/$res[«hits»])*100);
Imagettftext($im,7, 0, 86-width($text), 82, 0xCCCCCC, FONT_TAHOMA, $text);
Imagettftext($im,7, 0, 85-width($text), 81, 0x03804A, FONT_TAHOMA, $text);
}
}
ImagePng($im);
ImageDestroy($im);
?>
Скачать
Пример Ссылка Системные требования
Скачать GD, поддержка PNG
Скачать GD, поддержка PNG
Скачать GD 2.0+, поддержка PNG, поддержка TrueType
Скачать GD 2.0+, поддержка PNG, поддержка TrueType
Скачать GD 2.0+, поддержка PNG, поддержка TrueType

Если Вы в чем-то не разобрались, или хотите поделится интересным советом — пишите. Мы будем рады ответить на любые ваши вопросы

Источник:   codingrus.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи