Изменение внешнего вида счетчика в 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 |
Если Вы в чем-то не разобрались, или хотите поделится интересным советом - пишите. Мы будем рады ответить на любые ваши вопросы.
Оставить комментарий
Комментарии
1. В счётчиках 3, 4 и 5 не хватает строки
перед
ImageDestroy($im);
?>
2. В счётчике 5 в строке
лишняя буква s