Статистика на сайте. Пишем скрипт счетчика посещений.
Введение
Наверняка многие из вас посещая различные сайты, обращают внимание на счетчики, которые стоят на сайтах. Статистика показывает нам сколько человек посетило ресурс, сколько страниц был отгружено, сколько человек находятся на сайте в текущий момент и тд. Все это является очень полезным инструментом, т.к. как позволяет узнать владельцу сайта, востребованность и рейтинг его ресурса. Чем интересней и полезней ресурс, тем больше у него посещений.
На данный момент существует огромное количество сервисов, которые предлагают нам много инструментов для сбора статистики и данных, а также их анализа. Все они очень профессионально выполняют свои задачи,но все когда то начиналось с самописного счетчика, которые можно встретить и сейчас.
Если вы хотите понять как происходит учет пользователей, я подготовил урок, в котором я напишу счетчик посещений сайта, объясню как установить счетчик на сайт и использовать данные в своих целях.
Детали
Для того чтобы нам написать простенький счетчик нам придется узнать несколько новых функций.
* Работа с файлами (создание/чтение/запись); * Работа с сессиями; * Работа с функциями для создания изображения; * Подключение счетчика;
Создайте в папке www, папку counter. Это будет место для хранения файла статистики и скрипта. Далее я приведу несколько вариантов счетчиков.
Вариант 1
Чтобы использовать счетчик , нам необходимо создать html-страницу, в которую мы встроем скрипт. Пусть это будет простая страница, которая содержит информацию.
Сохраним эту страницу в папке www и перейдем к программированию счетчика.
counter.php
Чтобы сохранять полученные данные, нам необходимо их куда то записывать, пусть для начала это будет простой текстовый файл с именем stat.txt.
‹?php
$url = "counter/stat.txt";
Переменной $url присвоен адрес до файла. Это является, единственный конфигурационный элемент, в котором мы задаем нужные данные, далее скрипт состоит из логических выражений else if и функций работы с файлами
Этот фрагмент кода отвечает за проверку на наличие файла, весь ход логических действий я прописал в комментариях.
if(!file_exists($url)) { //Проверка на существование файла.
//Если файла не существует,
$count = 0;
$handle = fopen($url,"a");//создаем его,
fwrite($handle,$count);// и записываем нулевое значение
fclose($handle);//Закрываем файл
}
Далее опишем условие, когда файл создан.
else { //Если файл существует, то работаем с ним
$handle = fopen($url,"a+"); //Открываем его
$count = fread($handle,filesize($url)); //Читаем данные и присваеваем их переменной $count
fclose($handle); //Закрываем
$count++;//Добавляем одно посещение к полученному выше
$handle = fopen($url,"w"); // Открываем файл, и урезаем его до нулевой длины
fwrite($handle,$count); //Записываем переменную $count
fclose($handle); //Закрываем
}
В этом фрагменте как раз описан скрипт счетчика посещений, внимательно смотрите, в первом фрагменте мы открываем файл для того чтобы его открыть и узнать количество посещений. Далее мы увеличиваем полученное значение на 1 единицу ( $count++;) и записываем это значение в наш файл.
В конце файла мы выводим статистику при помощи оператора echo
echo "количество просмотров: $count ";
Мы рассмотрели самый простой тип счетчика, но поверьте, иногда сложнее и не требуется, например нам необходимо узнать количество прочтений страницы(статьи, объявления) внутри сайта. Обычно это указывает посетителям сайта наиболее интересный материал. Далее чтобы этот счетчик заработал, открываем наш файл index.php, и добавляем строчку до тэга
* Легко накручивается простым обновлением страницы (F5) . * Если несколько человек одновременно обратятся к скрипту, возникнет ошибка.Т.к. файл открыт и используется кем то другим, поэтому необходимо дополнить скрипт. * Если будет удален файл с данными, то вы потеряете накопленную статистику
Вариант 2
Счетчик учитывающий только посетителей. Что это значит? Посетители – это количество пользователей, которые посетили ваш ресурс, например за сутки, причем если даже человек будет обновлять страницу значение посещений прибавляться не будет.
Чтобы создать такой счетчик, нам необходимо научиться работать с сессиями. В чем смысл? Если человек посещает ваш сайт впервые, то создается сессия, которая работает до тех пор, пока человек не закрыл браузер, т.е. при последующих перезагрузках страницы (F5) либо переходах по сайту, мы будем проверять создана ли сессия. Если сессия существует, то учитывать пользователя не будем.
Данный вариант является немного усовершенствованным по сравнению с первым вариантом.
Обратите внимание на начало файла, функция session_start() инициализирует сессию.
counter.php
В этом фрагменте по сравнению с первым оставляем все без изменений
<?php
$url = "counter/stat.txt";
if(!file_exists($url)) {
//Если файла не существует, создаем его, и записываем нулевое значение
$count = 0;
$handle = fopen($url,"a");
fwrite($handle,$count);
fclose($handle);
}
Здесь тоже, только читаем файл, и получаем количество посещений.Далее смотрите внимательней
else {
//Если файл существует, то работаем с ним
$handle = fopen($url,"a+");//Открываем его
$count = fread($handle,filesize($url)); //Читаем данные и присваеваем их переменной $count
fclose($handle);
Создаем условие, если сессия отсутствует , то это значит человек посещает страницу в первый раз, поэтому переменной $_SESSION['count'] присваиваем какое то значение, которое проверяется в начале условия, далее к переменной $count добавляем единицу, и записываем её обратно в файл, причем для начала запираем доступ к нему, производим запись и открываем доступ.Это нужно для того чтобы в момент обращения нескольких посетителей к скрипту не возникало ошибок.
if (!isset($_SESSION['count'])) { //Если сессия отсутствует
$_SESSION['count'] = 1; //Создаем её
$count++; //Добавляем единицу к переменной
$handle = fopen($url,"w");
if (flock($handle, LOCK_EX)) {
fwrite($handle,$count);//Записываем её в файл
flock($handle, LOCK_UN); // отпираем файл
} else {
echo "Повторите позднее";
}
fclose($handle);
}
}
//Выводим количество просмотров.
echo "количество просмотров: $count";
?>
Теперь я обьясню, почему при нажатии F5 не добавляется посещение.Так как при первом посещении мы создаем сессию, то в результате проверки if(!isset($_SESSION['count']) выражение вернет значение FALSE, следовательно ничего прибавлять и записывать не будем.
[+] Плюсы:
* Простота установки * Не требует БД * Не накручивается обновлением страницы * При обращении скрипта нескольких человек одновременно, не возникает ошибки.
[-] Минусы данного счетчика:
* Если будет удален файл с данными, то вы потеряете накопленную статистику
Бонус
В этом варианте мы рассмотрим скрипт, который будет строить графическую картинку, на которой будет отображаться количество посетителей. Для этого нам нужна подложка для нашего счетчика, это должно быть изображение формата jpeg, для тестирования можете взять эту.
Далее нам необходимо доработать второй вариант, и добавить ещё один файл, который будет отвечать за построение картинки.
counter.php - Здесь находиться набор функций по работе с изображениями
<?php
// Подложка для счетчика
$im = ImageCreateFromJpeg("bg.jpg");
// Цвет текста
$black = imagecolorallocate($im,255,255,255);
// Отрисовка текста
imagestring($im,1,8,4,$_GET['s'], $black);
Header("Content-type: image/jpeg");
//Вывод изображения
ImageJpeg($im);
//Разрушаем изображение, чтобы не засорялась память
imagedestroy($im);
?>
Все эти три варианта обязательно пригодятся в будущем.
[+] Плюсы:
* Простота установки * Не требует БД * Не накручивается обновлением страницы * При обращении скрипта нескольких человек одновременно, не возникает ошибки. * Красивый, настраиваемый внешний вид.
[-] Минусы данного счетчика:
* Если будет удален файл с данными stat.txt, то вы потеряете накопленную статистику
Заключение
Все описанные варианты можно с легкостью применять на практике, для того чтобы вывести счетчик просто поместите код <?php @include(counter.php); ?> в нужное место
UPGRADE Счетчика - Графический счетчик хитов и посещений.
Детали
Для модифицирования счетчика нам потребуется освоить:
* Работа с функцией setcookie() и суперглобалом $_COOKIE; * Массивы в PHP; * Функции построения изображения в PHP; * Работа с файлами и бд MySQL.
Вариант 1.Счетчик на файлах
Весь счетчик будет состоять из нескольких файлов:
* index.php – страница на которой происходит вызов счетчика * counter.php – скрипт с логическими операциями и функциями чтения/записи данных * img.php – скрипт построения изображения * stat.txt – файл, содержащий статистику
index.php
Стандартный файл содержащий html-код, и подключение скрипта счетчика
Warning: include(‘counterphp’): failed to open stream: No such file or directory in /var/www/admin/data/www/shram.kiev.ua/index.php(219) : eval()'d code on line 267
Warning: include(): Failed opening '‘counterphp’' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/admin/data/www/shram.kiev.ua/index.php(219) : eval()'d code on line 267
Также в этом файле в самом верху страницы, до тегов и необходимо установить cookie(куки).
Первый атрибут у функции несет имя cookie, второй атрибут – значение, которое присвоено этому имени, т.е. если выполнить echo $_COOKIE['freshcoder'] , браузер выведет слово count.Третий атрибут устанавливает время действия cookie, т.е. если человек зашел в 10 утра, нам необходимо установить cookie на 14 часов. Время действия указывается в секундах.
Данный скрипт претерпел некоторые изменения. В качестве защиты от накрутки используется условие проверки наличия cookie на стороне пользователя.
Например человек зашел на сайт в 10 часов утра, нам необходимо добавить одно посещение и оставить cookies в браузере этого человека, которые будут действовать до 0.00 часов текущего дня.
Логика скрипта простая, если нет куков у пользователя, мы накручиваем счетчик на единицу и пишем значение в файл, иначе добавляем хит.
<?php
$url = "counter/stat.txt";
if(!file_exists($url)) {
//Если файла не существует, создаем его, и записываем нулевое значение
$count = "0::0";
$handle = fopen($url,"a");
fwrite($handle,$count);
fclose($handle);
}
else {
//Если файл существует, то работаем с ним
$data = file($url);//Открываем его
list($user,$hit) = explode("::",$data[0]); //Разбиваем массив на переменные
if(!$_COOKIE['freshcoder']){$user++;$hit++;}
else { $hit++;}
$handle = fopen($url,"w"); //Открываем файл
$count = $user."::".$hit; //Формируем строку
if (flock($handle, LOCK_EX)) { //Запираем файл
fwrite($handle,$count);//Записываем её в файл
flock($handle, LOCK_UN); // отпираем файл
} else {
echo "Повторите позднее";
}
fclose($handle);
}
//Выводим количество просмотров.
echo '<img src="img.php?u='.$user.'&h='.$hit.'" alt="stat" width="80" height="30" border="0" />';
?>
img.php
Данный скрипт претерпел значительные изменения. Т.к. функция imagestring(), при построении надписи за начало координат использует верхний левый угол, то со временем при увеличении длины строки цифр у нас возникнет проблема – часть их будет вылазить за изображение. Для того чтобы этого не происходило, напишем простые условия, которые получают данные , сравнивают их, и вызывают функцию imagestring() с измененными координатами.
Также в скрипте добавляем вторую строку для построения надписи. Данный скрипт получает данные параметром GET, поэтому
извлекать данные будем из суперглобала $_GET.
img.php?u=’.$user.’&h=’.$hit.’»
в этой строке мы присвоили переменной $_GET['u'] значение $user, а $_GET['h'] – значение $hit. Это весьма простой способ предачи параметров скрипту. Но такой метод не рекомендуется для передачи пароля или каких либо важных данных.
<?php
// Подложка для счетчика
$im = ImageCreateFromGif("bg.gif");</p>
// Цвет текста
$black = imagecolorallocate($im,255,255,255);
// Рисуем количство посетителей
if($_GET['u']>=1 AND $_GET['u']<10 ) {
imagestring($im,2,69,14,$_GET['u'], $black);
}
if($_GET['u']>=10 AND $_GET['u']<100 ) {
imagestring($im,2,64,14,$_GET['u'], $black);
}
if($_GET['u']>=100 AND $_GET['u']<1000 ) {
imagestring($im,2,59,14,$_GET['u'], $black);
}
if($_GET['u']>=1000 AND $_GET['u']<10000 ) {
imagestring($im,2,54,14,$_GET['u'], $black);
}
if($_GET['u']>=10000 AND $_GET['u']<100000 ) {
imagestring($im,2,49,14,$_GET['u'], $black);
}
// Рисуем количство хитов
if($_GET['h']>=1 AND $_GET['h']<10) {
imagestring($im,2,69,3,$_GET['h'], $black);
}
if($_GET['h']>=10 AND $_GET['h']<100 ) {
imagestring($im,2,64,3,$_GET['h'], $black);
}
if($_GET['h']>=100 AND $_GET['h']<1000 ) {
imagestring($im,2,59,3,$_GET['h'], $black);
}
if($_GET['h']>=1000 AND $_GET['h']<10000 ) {
imagestring($im,2,54,3,$_GET['h'], $black);
}
if($_GET['h']>=10000 AND $_GET['h']<100000 ) {
imagestring($im,2,49,3,$_GET['h'], $black);
}
Header("Content-type: image/gif");
ImageGif($im);
imagedestroy($im);
?>
Вот и получился счетчик для учета переходов по страницам и указывающий реальное количество посетителей.
Вариант 2. Счетчик на MySQL
Для начала необходимо создать таблицу , в которой мы будем хранить все данные. Если вы тестируете на локальном сервере, то запрос будет следующий:
При работе с базой данных поменяется только файл counter.php
counter.php
В этом примере все намного проще. Первым шагом подключаемся к БД.
<?php
//Подключаемся к БД.
$db=@mysql_connect("localhost", "root", "pass") or die("Ошибка подключения");
@mysql_select_db("test", $db) or die("Не могу выбрать БД");
$q = mysql_query("SELECT * FROM counter");
$r = mysql_fetch_array($q);
if(!$_COOKIE['freshcoder'])
{
$r['hosts']++; $r['hits']++; //Если нет cookie прибавляем значение
}
else {$r['hits']++; } //Если существуют куки, то просто плюсуем хиты
mysql_query("UPDATE counter SET hosts='".$r['hosts']."',hits='".$r['hits']."'");
echo '<img src="img.php?u='.$r['hosts'].'&h='.$r['hits'].'" alt="stat" width="80" height="30" border="0" />';
?>
При помощи функции mysql_fetch_array получаем массив $r, ключами которого являются поля таблицы counter. Переменная $r['hosts'] – это посетители, а $r['hits'] – это хиты. Так же как и при работе с файлами используем условия и проверку cookie, если не существуют, то переменную $r['hosts'] увеличиваем на единицу, если существую то мы увеличиваем переменную $r['hits'].
Далее следует запрос, который обновляет запись и вставляет значения. После этого выводим скрипт картинки.
img.php
Оставляем без изменений.
<?php
// Подложка для счетчика
$im = ImageCreateFromGif("bg.gif");</p>
// Цвет текста
$black = imagecolorallocate($im,255,255,255);
// Рисуем количство посетителей
if($_GET['u']>=1 AND $_GET['u']<10 ) {
imagestring($im,2,69,14,$_GET['u'], $black);
}
if($_GET['u']>=10 AND $_GET['u']<100 ) {
imagestring($im,2,64,14,$_GET['u'], $black);
}
if($_GET['u']>=100 AND $_GET['u']<1000 ) {
imagestring($im,2,59,14,$_GET['u'], $black);
}
if($_GET['u']>=1000 AND $_GET['u']<10000 ) {
imagestring($im,2,54,14,$_GET['u'], $black);
}
if($_GET['u']>=10000 AND $_GET['u']<100000 ) {
imagestring($im,2,49,14,$_GET['u'], $black);
}
// Рисуем количство хитов
if($_GET['h']>=1 AND $_GET['h']<10) {
imagestring($im,2,69,3,$_GET['h'], $black);
}
if($_GET['h']>=10 AND $_GET['h']<100 ) {
imagestring($im,2,64,3,$_GET['h'], $black);
}
if($_GET['h']>=100 AND $_GET['h']<1000 ) {
imagestring($im,2,59,3,$_GET['h'], $black);
}
if($_GET['h']>=1000 AND $_GET['h']<10000 ) {
imagestring($im,2,54,3,$_GET['h'], $black);
}
if($_GET['h']>=10000 AND $_GET['h']<100000 ) {
imagestring($im,2,49,3,$_GET['h'], $black);
}
Header("Content-type: image/gif");
ImageGif($im);
imagedestroy($im);
?>