ProfiPHPProfiPHP
Категория: Полезное в PHP

Графический счетчик посещений в PHP

Рассмотрим полностью процесс работы и установки простого счетчика посещений на сайте.

Данный счетчик будет отображать количество всех просмотров страницы и уникальных пользователей за день.

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

Информация будет храниться в текстовых файлах, что позволит без каких-либо проблем установить данный скрипт практически без навыков администрирования.

Для начала нам необходимо создать шаблон размерами 88×31 пикселей, который будет выполнять функции фонового изображения. Назовем его bg.png.

Опишем структуру файлов и каталогов скрипта:
/counter/content/total.dat
/counter/background/bg.png
/counter/counter.php
В директории Content будут сохранятся базы с количеством просмотров и уникальных посетителей для каждого дня.

А теперь опишу весь процесс выполнения скрипта Counter.php.

Объявляем константу, в которой хранится путь к данному каталогу:
define( 'ROOT_PATH', str_replace( '/counter', '', str_replace( "\\", "/", realpath( dirname( __FILE__ ) ) ) ) );
Более подробно можно узнать в статье Реальный путь к каталогу в Linux и Windows.

Далее создаем функцию, результатом выполнения которой будет реальный IP адрес пользователя. Более подробно можно прочитать здесь - Получение реального IP-адреса.
function getIp(  ) {
if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) return $_SERVER['HTTP_CLIENT_IP'];
if( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) return $_SERVER['HTTP_X_FORWARDED_FOR'];
return $_SERVER['REMOTE_ADDR'];
}
Выполняем функцию:
$ip = getIp(  );
Создаем название базы данных из даты:
$filename = ROOT_PATH.'/counter/content/'.date( 'dmY', time(  ) ).'.dat';
Далее проверяем существование базы и в зависимости от этого, мы открываем существующий файл или создаем новый:
if ( file_exists( $filename ) ) {
@chmod( $filename, 0644 );
$fopendb = fopen( $filename, 'r' );
flock( $fopendb, LOCK_SH );
$data = fread( $fopendb, filesize( $filename ) );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
list( , $list_ip ) = array_map( 'trim', explode( '<!-- IP -->', $data ) );
list( , $click ) = array_map( 'trim', explode( '<!-- CLICK -->', $data ) );
$array_ip = explode( '|', $list_ip );
}
else {
$click = 1;
$data = "<!-- IP -->".getIp( )."<!-- IP -->\n";
$data .= "<!-- CLICK -->1<!-- CLICK -->\n";
$data = stripslashes( $data );
$fopendb = fopen( $filename, 'w+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, $data );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $filename, 0644 );
$array_ip = array( );
}
Создаем изображения:
$img = ImageCreateFromPNG( ROOT_PATH.'/counter/background/bg.png' );
$TextColor = ImageColorAllocate( $img, 255, 255, 255 );
ImageString( $img, 2, 5, 2, count( $array_ip ), $TextColor );
ImageString( $img, 2, 5, 14, $click, $TextColor );
Header( 'Content-type: image/jpeg' );
imageJPEG( $img, NULL, 100 );
ImageDestroy( $img );
Перезаписываем файл, увеличивая при этом количество просмотров, и, если новый пользователь - добавляем IP адрес.
if ( ! in_array( $ip, $array_ip ) ) array_push( $array_ip, $ip );
$data = "<!-- IP -->".implode( '|', $array_ip )."<!-- IP -->\n";
$data .= "<!-- CLICK -->".( $click + 1 )."<!-- CLICK -->\n";
$data = stripslashes( $data );
$fopendb = fopen( $filename, 'w+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, $data );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $filename, 0644 );
И последнее что нам нужно, это подключить графический счетчик посещений:
<img src="/counter/counter.php" alt="counter" style="border: none; width: 88px; height: 31px;" />
Теперь, когда первый пользователь новой даты посещает сайт, скрипт создает новый файл с именем, соответствующем текущей дате, а в содержание записывает IP адресов посетителя.

При последующих посещениях выполняется проверка, есть ли в базе данный IP. Если нет - добавляем, если уже существует - пропускаем добавления. После каждого просмотра увеличиваем количество просмотров страниц на 1.

А теперь рассмотрим логику работы с базой данных MySQL. Создадим 2 таблицы в базе данных. Таблица visits_ip:
`id` int(11) NOT NULL auto_increment,
`ip` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
и таблица visits:
`id` int(11) NOT NULL auto_increment,
`hosts` int(11) unsigned NOT NULL DEFAULT '0',
`views` int(11) unsigned NOT NULL DEFAULT '0',
`date` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
Код счетчика:
// Сегодняшняя дата:
$date = date( "Y-m-d" );
// Узнаем, были ли посещения за сегодня:
"SELECT `id` FROM `visits` WHERE ( `date` = '{$date}' ) LIMIT 0,1"
// Если сегодня еще не было посещений
if ( mysqli_num_rows == 0 )
{
// Очищаем таблицу ips
"DELETE FROM `visits_ip`"

// Заносим в базу IP-адрес текущего посетителя:
"INSERT INTO `visits_ip` SET `ip` = '{$_IP}'"

// Заносим в базу дату посещения и устанавливаем количествово просмотров и уникальных посещений в значение 1:
"INSERT INTO `visits` ( `date`, `hosts`, `views` ) values ( '{$date}', '1', '1' )"
}
else // Если посещения сегодня уже были
{
// Проверяем, есть ли уже в базе IP-адрес, с которого происходит обращение:
"SELECT `id` FROM `visits_ip` WHERE ( `ip` = '{$_IP}' ) LIMIT 0,1"

// Если такой IP-адрес уже сегодня был (т.е. это не уникальный посетитель):
if ( mysqli_num_rows > 0 )
{
// Добавляем для текущей даты +1 просмотр (хит):
"UPDATE LOW_PRIORITY `visits` set `views` = `views` + 1 WHERE ( `date` = '{$date}' )"
}
else // Если сегодня такого IP-адреса еще не было (т.е. это уникальный посетитель):
{
// Заносим в базу IP-адрес этого посетителя:
"INSERT INTO `visits_ip` SET `ip` = '{$_IP}'"

// Добавляем в базу +1 уникального посетителя (хост) и +1 просмотр (хит):
"UPDATE LOW_PRIORITY `visits` SET `hosts` = `hosts` + 1, `views` = `views` + 1 WHERE ( `date` = '{$date}' )"
}
}
Извлечение статистики происходит следующим образом:
// Сегодняшняя дата:
$date = date( "Y-m-d" );
// Извлекаем статистику:
"SELECT `hosts`, `views` FROM `visits` WHERE `date` = '{$date}'"

Добавить комментарий

Имя:
Текст комментария: