|
|
|
| Появилась возможность выводить на страничке результаты счётчика PowerCounter в графическом или текстовом виде. Образец можно посмотреть на нижеуказанном урле.
Там же исходники и пояснения, что нужно подправить в PowerCounter 3.3.6
Кроме появилась возможность задавать тайм-аут для повторного засчитывания уникальных хостов. Чтобы 20 подряд сделанных обновлений страниц не увеличивал бы общий счётчик посещений. Исходники счётчика с картинками прикреплены к данному сообщению.
Надеюсь, что авторы PowerCounter включат эти возможности в очередную версию PowerCounter.
Хотелось бы ещё иметь возможность использовать один счётчик для нескольких сайтов. Для этого в базы надо ввести поле для id сайта. И вызывать подсчёт
"Для того, чтобы страница на сайте учитывалась счётчиком необходимо в начало этой страницы включить файл count.php и указать id сайта:
<?php
$site_id=1;
require_once("count.php");
?>
После чего в статистике можно бы было просматривать информацию также с учётом любого сайта.
Сейчас же приходится для каждого сайта на хостинге ставить свою копию PowerCounter. Кроме того, при доступной единственной базе - нужно для каждой копии делать таблицы с отличающимися именами и соответственно вносить все эти изменения в исходники. | |
|
|
|
|
|
|
|
для: tuder
(09.06.2006 в 09:20)
| | Симпатичная штука получилась... только пара непонятностей:
если вы все равно проверяете количество строк, то зачем использовать count(putdate)?
Ну и вообще меня эта функция смущает: мне, например, интересно проследить каким путем пользователь перемещался по сайту. Но для таких как я, есть значение 0:)
И по поводу графического счетчика: почему такой странный подбор данных? посетители и хиты за сегодня - понятно, а третий - хиты за все время... или это чтобы больше казалось?:) | |
|
|
|
|
|
|
|
для: Loki
(09.06.2006 в 11:57)
| | 1. После перехода на новый метод с тайм-аутом может быть несколько записей попадающих под этот интервал. Вот я их и считаю. Чтобы не искать последнюю запись и пр.
Возможно можно логику и улучшить.
2. Если страница изменится, то такая запись будет занесена в базу. Там проверяется на $id_page. Если изменилось, то засчитается. Не заносится лишь только для этой же страницы.
3. Подбор данных вроде стандартный для подобных счётчиков. hotlog, spylog.
И отражает из админки по PowerCounter
Сегодня За всё время
Засчитанные хосты 8 15
Хосты 8 15
Засчитанные хиты 22 54
Хиты 22 54
Вот в текстовом это и показывается. А в графическом вроде как
Засчитанные хиты всего 54
Засчитанные хосты всего 15
Засчитанные хосты сегодня 8 | |
|
|
|
|
|
|
|
для: tuder
(09.06.2006 в 13:20)
| | В том-то и дело, что количество записей вы запрашиваете, но нигде не проверяете. Кроме того, если ваш код работает (а с виду это так:), то этот проверочный запрос всегда будет возвращать единицу (в том случае, когда вообще будет что-то возвращать). Так что count тут совершенно лишний.
Мне казалось, что обычно на счетчиках выводят именно общее количество посетителей... но я могу ошибаться. | |
|
|
|
|
|
|
|
для: Loki
(09.06.2006 в 13:41)
| | Почему не проверяю?
Делается запрос.
$query = "SELECT count(putdate) FROM 'system_ip' WHERE 'ip'=INET_ATON('$ip') and 'browsers'='$browser' and 'systems'='$os' and 'id_page'='$id_page' and ((UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( 'putdate' ) ) < $timeout)";
Результат запроса (количество совпадений за тайм-аут) заносится в переменную $last
list($last)=mysql_fetch_row(mysql_query($query));
Если их нет - идёт запись в базу.
if ($last==0)
И работает ведь это. :) Попробуйте на той странице пообновлять - счётчик добавлятся не будет.
А насчёт, что показывается, вот:
http://hotlog.ru/counter_code.php
Например: "количество ПОСЕТИТЕЛЕЙ /всего +сегодня/)", а там ещё и "количество ХИТОВ, ХОСТОВ, ПОСЕТИТЕЛЕЙ /сегодня и всего/)"
И вот аналог сводной таблицы
http://viewstat.hotlog.ru/site_stat.php?id=172248
Только в PowerCounter несколько другая терминалогия.
Хорошо бы её сопоставить с этим.
Я так понимаю: хит - это сколько раз "дёрнули" счётчик.
Хост - это уникальные ип.
Посетитель - это уникальный пользователь с хоста со своим бровзером и оперционкой, как имнимум. | |
|
|
|
|
|
|
|
для: tuder
(09.06.2006 в 14:06)
| | >Почему не проверяю?
Вы проверяете только количество возвращенных запросом строк, а значение COUNT(*) вы не проверяете.
>со своим бровзером и оперционкой. То-есть если я в течение дня зайду под тремя броузерами, то меня посчитает как трех посетителей? на мой взгляд, это неправильно. С другой стороны, и противоположные аргументы можно привести:) | |
|
|
|
|
|
|
|
для: Loki
(09.06.2006 в 14:42)
| | 1. Может я что-то не понимаю? Или про разное говорим?
У меня, во-первых, count(putdate), а не count(*). Если где-то count(*) - это не моё. :-)
Во-вторых, count(putdate) - всегда, если я грубо не ошибаюсь, вернёт _одну_ строку. А в ней одно значение COUNT - количество записей подходящих под условие. Вот это значение и заношу в переменную $last.
2. Да, за трёх. А кто из приверженцев ИЕ, пойдёт на какаой-то сайт Оперой?
И наоборот. А если пойдёт, то этот факт будет зарегистрирован.
Можно, конечно, ещё и разрешение экрана и пр...
Но я исхожу из возможностей PowerCounter. Какие данные доступны, теми и оперирую. | |
|
|
|
|
|
|
|
для: tuder
(09.06.2006 в 15:33)
| | 1. прошу прощения, я mysql_fetch_row прочел как mysql_num_rows. Отсюда и непонимание:)
2. Ну некоторые несознательные программы открывают по ссылке не броузер по умолчанию, а тот, который им больше нравится:)
Например, The Bat у меня открывает MyIE, если не открыта опера... а QIP так и вообще IE несмотря ни на что... очень раздражает это:) | |
|
|
|
|
|
|
|
для: Loki
(09.06.2006 в 16:20)
| | У меня и Бат и Кип открывают в Опере, может потому как она по умолчанию бровзером выставлена?..
Но в любом случае другой бровзер - это повод занести это в базу для статистики и засчитать хит.
Непонятки с терминологией. Хиты - это просмотры страниц, хосты - посетители? Мне, честно говоря, не понятно, что есть хит/хост просо так и засчитанный. Всё равно же
засчитываются и показываются и те и другие. Лучше уж так и писать, чем краткое объяснение на тестовой страничке.
Прошёлся ещё по исходникам PowerCounter, результаты на http://files.byte.nsk.su/test/
Переименовал и перенёс второй config.php (о наличии двух файлов с одинаковыми именами задаваля в форуме вопрос), перенёс документацию в отдельную папку.
Кстати, а зачем в admin/image лежат файлы button2.gif imgmenu.gif ? Нигде в исходниках не нашёл упоминание о них.
Собственно всё исправленные исходники в выложенном архиве. Можно скачать и поверх распаковать. Вроде всё работоспособно. Все изменения не повлияют на старые данные. Можно внести изменения в документацию и выложить версию 3.6.7 :-) Дополнительный файл графического счётчика - базируется на том, что сделано. Его отсутствие в "дистрибутиве" ничего не меняет. Можно туда и не включать. | |
|
|
|
|
|
|
|
для: tuder
(13.06.2006 в 14:05)
| | Совсем забыл про эту тему:)
Я вспомнил что мне не понравилось: даже если я выставляю значение таймаута 0, то запрос к БД все равно происходит:)
Надо бы условие перед ним ввести:) | |
|
|
|
|
|
|
|
для: Loki
(13.06.2006 в 17:01)
| | Так всё ж в ваших руках. :)) Я передаю сделанное тому, кто может внести эти и любые другие изменение и выложить новую версию PowerCounter, который делается "при активном участии Левина А.В. (loki_angel@mail.ru, http://alna.spb.ru), который буквально вдохнул в него вторую жизнь."
А так - вставил проверку.
Мне во тоже не нравится, что в count.php дублируется кусок из config.php
$tbl_ip = 'system_ip'; // Для совместимости с 2.9 перименовать в ip
$tbl_pages = 'system_pages'; // Для совместимости с 2.9 перименовать в pages
$tbl_refferer = 'system_refferer'; // Для совместимости с 2.9 перименовать в refferer
$tbl_searchquerys = 'system_searchquerys'; // Для совместимости с 2.9 перименовать в searchquerys
|
А также установка соединения с базой. Этого можно было бы избежать, просто подключив config.php. Правда, теперь это потребует довольно бьольшой правки кода в разных модулях.
Кстати, совсем свежее сообщение в форуме с просьбой сделать возможность использовать один счётчик для разных сайтов.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=19180&page=1
Когда на хостинге выложены несколько сайтов/доменов, но доступна одна лишь база. }{м, однако про это я уже подробно писал... | |
|
|
|
|
|
|
|
для: tuder
(14.06.2006 в 07:21)
| | >не нравится, что в count.php дублируется кусок
он не дублируется. count.php вполне самостоятельный код, который занимается сбором информации. А ее анализом у меня занимаются две разные версии счетчика.
>но доступна одна лишь база
именно для этих целей в третьей версии названия всех таблиц вынесены из кода в настройки: в одну базу можно пихать счетчики пока на сервере место не кончится:)
Графическое отображение обязательно прикрутим, только надо будет немного переделать - не нравится мне что код светит расположение счетчика. Надо будет вынести в корень.
PS Функция add_blank произвела на меня неизгладимое впечатление!:) Сильно порадовался что символов всего 10:) Предлагаю переписать как-то так:
<?
function add_blank($count)
{
return substr(" ".$count, -10);
}
|
| |
|
|
|
|
|
|
|
для: Loki
(14.06.2006 в 10:15)
| | 1. То есть count.php можно использовать без всего остального? Но всё-равно ему нужен нынешний admin/dbconfig.php
Почему бы тогда там же не положить и opendb.php?
Где opendb.php примерно такого содержания
<?php
// Подключиться к mysql
@dl('mysql.so');
// Устанавливаем соединение с базой данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) {
echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
exit();
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) ) {
echo( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
exit();
}
?>
|
И использовать эти два файла и для count.php и для анализа.
2. То есть плодить в базе таблицы? И для каждого сайта класть свой count.php и config.php с разными именами этих таблиц? Это не есть удобно.
Достаточно для всех баз (а может даже не для всех) добавить поле id_site и вызывать
count.php?id=id_site
Добавить базу system_id_site содержашую поля
id_site - числовой идентификатор
url - имя сайта для которого будет работать счётчик
hit_max
hit_today
host_max
host_today
password
тогда для графического счётчика можно будет дёргать только эту базу
cntimg.php?id=id_site&color=red
Что значительно снизит нагрузку по запросам к базе. :)
И анализ делать также для конкретного id_site добавив ко всем выборкам это условие.
При этом при наличии пароля статистика будет доступна по паролю, при отсутствии - любому.
P.S. А я и писал: "Вывод графического(текстового) счётчика сделан по образцу SR Total Counter 1.1 by Sad Raven" - его я никак не оптимизировал. Просто скрестил ужа с ёжиком. :)
Исправил. | |
|
|
|
|
|
|
|
для: tuder
(14.06.2006 в 10:58)
| | 1. Нет. У файла count.php свой собственный блок кода для коннекта к базе. Вы, конечно, правы - удобнее держать один модуль, но так как проект некоммерческий, то пишу в большой степени под свои нужды. А мне удобнее чтобы система сбора статистики и ее анализа не пересекались. В этом случае могу курочить систему анализа прямо по живому:)
>Это не есть удобно
Не знаю для кого это неудобно: для БД удобно. Для разработчика - удобно... есть недовольные?:) | |
|
|
|
|
|
|
|
для: Loki
(14.06.2006 в 11:37)
| | Никак нет. :-)
Просто люблю универсальность. Когда один модуль можно использовать во многих местах. | |
|
|
|
|
|
|
|
для: Loki
(14.06.2006 в 11:37)
| | >проект некоммерческий, то пишу в большой степени под свои нужды. А мне удобнее чтобы система сбора статистики и ее анализа не пересекались. В этом случае могу курочить систему анализа прямо по живому:)
А всё-таки получается, что эти системы пересекаются. Нигде в описании/документации не оговорено, что требуется ежедневно запускать анализ собранной статистики. Понятно, что написано под свои нужды и постоянно проводится анализ и запуск статистики.
Но сам count.php, имеющий "свой собственный блок кода для коннекта к базе" - не производит указанных действий: "Теперь полная информация сохраняется лишь
за сутки, после чего она подвергается сжатию и помещается в суточные архивные
таблицы. По прошествии недели информация сжимается в недельные таблицы, а по
прошествию месяца в месячные таблицы. Разумеется вся информация, которая не
требуется для выведения отчётов удаляется."
И если система анализа не запускалась,то в "суточной таблице" будет накапливаться и накапливаться данные.
Тем более сейчас уже, это не суточная, а месячная таблица? Но каким образом всё же хранится и архивируется информация - не понятно.
Согласно приведённым дампам - часть потеряна, часть занесена в архивы раньше времени.
Потэтому надо бы или поправить описания, либо доработать алгоритм архивизации при нерегулярном запуске программы анализа. | |
|
|
|
|
|
|
|
для: tuder
(23.08.2006 в 14:39)
| | >Потэтому надо
Кому надо и почему "поэтому"?
Если вы взяли фрагмент чужого кода, не смогли в нем разобраться и он,как следствие, не работет так, как вам хочется, то из этого, еще ничего не следует. | |
|
|
|
|
|
|
|
для: Loki
(23.08.2006 в 18:00)
| | >Если вы взяли фрагмент чужого кода, не смогли в нем разобраться и он,как следствие, не работет так, как вам хочется, то из этого, еще ничего не следует.
Поэтому я и пытаюсь получить комментарии и разъяснения от авторов этого кода, чтобы разобраться в логике работы.
Но когда я читаю в инструкции одну информацию:
полная информация сохраняется лишь
за сутки, после чего она подвергается сжатию и помещается в суточные архивные
таблицы.
В форуме вижу другой ответ: В таблице ip данные хранятся за последний месяц.
При этом вижу в этой таблице данные за прошлый месяц, а в архивной - частично за текущий.
Я тут теряюсь в попытке понять логику.
При этом, я использую стандартную, родную функция выбора данных из баз, чтобы получить: статистика кроме сегодняшнего дня берется из архивной таблицы, а текущие сутки из таблицы ip.
Но меня "обвиняют" в том, что: Значит что-то вы напутали и берете данные только из архивной таблицы.
Кроме этого, я пытаюсь выяснить, что будет, если анализ статистики запускать не каждый день, когда полная информация сохраняется лишь за сутки, после чего она подвергается сжатию?
Что если запускать анализ 2-3 раза в месяц? При таком условии можете ли уверенно заявлять: Так что никаких потеряных данных нет?
Или всё же требуется выполнять некие действия ежедневно, для корректной архивации данных? Иначе как можно объяснить по прежнему сохраняющиеся данные в текущей базе за прошлый месяц? И отсутствия их в архивной таблице?
Я это уже задаю вопросы непосредственно по работе PowerCounter, вне связи с моим приложением. | |
|
|
|
|
|
|
|
для: Loki
(14.06.2006 в 10:15)
| | >А ее анализом у меня >занимаются две разные версии счетчика.
>
>>но доступна одна лишь база
>именно для этих целей в третьей версии названия всех таблиц
>вынесены из кода в настройки: в одну базу можно пихать
>счетчики пока на сервере место не кончится:)
>
Если "поместить имя страницы в переменной $titlepage, в отчётах системы, данная страница будет участвовать под этим именем. Более того, вы можете объединять несколько страниц в одну строку, присваивая им одинаковые названия.
<?php
$titlepage = "Название страницы";
require_once("count.php");
?>
|
Можно ли таким образом задавать анализ только для указанной страницы? | |
|
|
|
|
|
|
|
для: tuder
(15.06.2006 в 12:14)
| | Непонял вопроса | |
|
|
|
|
|
|
|
для: Loki
(15.06.2006 в 16:36)
| | Несколько вопросов по PowerCounter в разрезе PowerImage. Чисто академический интерес.
1) В базу system_ip, я так понимаю, counter.php заносит в поле browsers информацию.
Когда бровзер отдаёт такую строку:
Opera/7.23 (Windows NT 5.1; U) [ru]
явно учитывается, что это Опера. Если же
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50
то заносится Mozilla? Но это уже некорректный подсчёт. :-(
Лучше уж писать полный ответ.
2) Что подсчитывается/меняется, какая обработка баз происходит при запуске pcounter/admin ?
Дело в том, что count.php заносит все хиты в базу.
Некоторое время PowerImage их выдёргивает и отображает правильно. 400-420-450-500-505
Потом вдруг замечаю, что уже продолжительное время счётчик показывает 505. Через пару дней вообще 504. :-( )
Захожу в админку, смотрю статистику хитов/хостов - 526. Хм, тут же обновляю страничку с графическим баннером - всё, там тоже 526.
Теперь снова некоторое время будет подсчитываться и отображаться правильно.
Но ведь сами пишете:
> мне удобнее чтобы система сбора статистики и ее анализа не пересекались.
А выходит, что собранную статистику нельзя корректно использовать "не обработав" её анализом.
3) Нельзя ли всё-таки внести предложенные мною изменения, чтобы я снёс эту страничку?
http://www.files.byte.nsk.su/test/
И выпустить 3.3.7 - это займёт не более получаса времени. | |
|
|
|
|
|
|
|
для: tuder
(18.08.2006 в 11:51)
| | > 1. Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50
>то заносится Mozilla? Но это уже некорректный подсчёт. :-(
Нет это не так, в этом случае в базу ложиться Opera.
2. Не очень понятно, если честно. | |
|
|
|
|
|
|
|
для: cheops
(18.08.2006 в 12:27)
| | count.php заносит данный в базы.
Когда заходишь в админку, для просмотра статистики, для просмотра хитов используется модуль hits.php
Как, я писал на свой страничке, из этого модуля я выдернул кусок и положил в отдельный файл: functioncounter.php, подключив его обратно к hits.php через include()
<?
///////////////////////////////////////////////////
// Система учёта посещаемости сайта - PowerCounter
// 2003-2006 (C) IT-студия SoftTime (http://www.softtime.ru)
// Поддержка: http://www.softtime.ru/forum/
// Симдянов И.В. (simdyanov@softtime.ru)
// Кузнецов М.В. (kuznetsov@softtime.ru)
// Голышев С.В. (softtime@softtime.ru)
// Левин А.В. (loki_angel@mail.ru)
///////////////////////////////////////////////////
// Функция возвращает массив из трёх переменных:
// количество хостов,
// количество засчитанных хитов и
// общее количества хитов.
// $begin - число дней, которое необходимо вычесть из текущей даты,
// для того чтобы получить начальную точку временного интервала
// $end - число дней, которое необходимо вычесть из текущей даты,
// для того чтобы получить конечную точку воменного интервала
// $id_user - первичный ключ записи таблицы users, соответствующий
// текущему сайту
// $tbl_ip - название таблицы, в которой хранятся IP-адреса
// $tbl_arch_hits - название архивной таблицы
//отсюда и ниже исправления от 11.02.06
function show_ip_host_today($tbl_ip) //изменено 11.02.06 Loki
{
// Запрос на статистику за текущий неархивированный день
$tmp1 = "putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL 1 DAY";
// Общее число хитов
$query_hit_total = "SELECT COUNT(*)
FROM $tbl_ip
WHERE ".$tmp1;
// Засчитанные хиты
$query_hit = "SELECT COUNT(*)
FROM $tbl_ip
WHERE systems!='none' AND
systems NOT LIKE 'robot_%' AND ".$tmp1; //изменено 14.02 Loki
// Подсчитываем число IP-адресов (хостов)
$query_host_total= "SELECT COUNT(DISTINCT ip)
FROM $tbl_ip
WHERE ".$tmp1;
// Подсчитываем число уникальных посетителей за сутки
$query_host = "SELECT COUNT(DISTINCT ip)
FROM $tbl_ip
WHERE systems!='none' AND
systems NOT LIKE 'robot_%' AND ".$tmp1; //изменено 14.02 Loki
// Осуществляем запросы к базе данных
$tot_hit = mysql_query($query_hit_total);
if(!$tot_hit) exit(mysql_error());
$uni_hit = mysql_query($query_hit);
if(!$uni_hit) exit(mysql_error());
$tot_hst = mysql_query($query_host_total);
if(!$tot_hst) exit(mysql_error());
$uni_hst = mysql_query($query_host);
if(!$uni_hst) exit(mysql_error());
// Если запросы выполнениы удачно,
// получаем результат за текущие сутки
$hits_total_today = mysql_result($tot_hit, 0);
$hits_today = mysql_result($uni_hit, 0);
$hosts_total_today = mysql_result($tot_hst, 0);
$hosts_today = mysql_result($uni_hst, 0);
return array($hits_total_today, $hits_today, $hosts_total_today, $hosts_today);
}
function show_ip_host($begin, $end, $tbl_arch_hits, $tbl_arch_hits_month) //изменено 11.02.06 Loki
{
// Обнуляем хиты и хосты
$hosts_total = 0;
$hosts = 0;
$hits_total = 0;
$hits = 0;
/////////////////////////////////////////////////////////////////////////////
// Исходим из таблицы соответствия
// begin end
// сегодня 1 0 - это извлекаем из $tbl_ip //этот фрагмент исключен 11.02.06 Loki
// вчера 2 1 - это извлекаем из $tbl_arch_hits
// неделя 7 0 - это извлекаем из $tbl_arch_hits
// месяц 30 0 - это извлекаем из $tbl_arch_hits
// всё время 0 0 - это извлекаем из $tbl_arch_hits
/////////////////////////////////////////////////////////////////////////////
// Если требуемый интервал затрагивает дни, упакованные в архивную таблицу
// плюс ко всему извлекаем информацию из архивной таблицы $tbl_arch_hits
if($begin != 1 && $begin != 0)
{
// Запрос на статистику за временной интервал определяемый
// параметрами $begin,$end
if($end != 0) $tmp1 = "putdate < DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '".($end - 1)."' DAY";
else $tmp1 = "putdate < DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '$end' DAY";
if($begin == 0) $tmp2 = "";
else $tmp2 = " AND putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '".($begin - 1)."' DAY";
// Общее число хитов
$query_hit_total = "SELECT SUM(hits_total)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Засчитанные хиты
$query_hit = "SELECT SUM(hits)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Подсчитываем число IP-адресов (хостов)
$query_host_total= "SELECT SUM(hosts_total)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Подсчитываем число уникальных посетителей за сутки
$query_host = "SELECT SUM(host)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Осуществляем запросы к базе данных
$tot_hit = mysql_query($query_hit_total);
if(!$tot_hit) exit(mysql_error());
$uni_hit = mysql_query($query_hit);
if(!$uni_hit) exit(mysql_error());
$tot_hst = mysql_query($query_host_total);
if(!$tot_hst) exit(mysql_error());
$uni_hst = mysql_query($query_host);
if(!$uni_hst) exit(mysql_error());
// Если запросы выполнениы удачно,
// получаем результат
$hits_total += mysql_result($tot_hit, 0);
$hits += mysql_result($uni_hit, 0);
$hosts_total += mysql_result($tot_hst, 0);
$hosts += mysql_result($uni_hst, 0);
}
// Если требуемый интервал затрагивает дни, упакованные в месячную архивную таблицу
// плюс ко всему извлекаем информацию из архивной таблицы $tbl_arch_hits_month
if($begin == 0 && $end == 0)
{
// Запрос на статистику за временной интервал определяемый
// параметрами $begin,$end
$tmp1 = "putdate < DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL '$end' DAY";
$tmp2 = "";
// Общее число хитов
$query_hit_total = "SELECT SUM(hits_total)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Засчитанные хиты
$query_hit = "SELECT SUM(hits)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Подсчитываем число IP-адресов (хостов)
$query_host_total= "SELECT SUM(hosts_total)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Подсчитываем число уникальных посетителей за сутки
$query_host = "SELECT SUM(host)
FROM $tbl_arch_hits
WHERE ".$tmp1.$tmp2;
// Осуществляем запросы к базе данных
$tot_hit = mysql_query($query_hit_total);
if(!$tot_hit) exit(mysql_error());
$uni_hit = mysql_query($query_hit);
if(!$uni_hit) exit(mysql_error());
$tot_hst = mysql_query($query_host_total);
if(!$tot_hst) exit(mysql_error());
$uni_hst = mysql_query($query_host);
if(!$uni_hst) exit(mysql_error());
// Если запросы выполнениы удачно,
// получаем результат
$hits_total += mysql_result($tot_hit, 0);
$hits += mysql_result($uni_hit, 0);
$hosts_total += mysql_result($tot_hst, 0);
$hosts += mysql_result($uni_hst, 0);
// Получаем самое старое число из таблицы $tbl_arch_hits,
// всё, что позже берём из таблицы $tbl_arch_hits_month
$select = "SELECT UNIX_TIMESTAMP(MIN(putdate)) AS data FROM $tbl_arch_hits";
$dat = mysql_query($select);
if(!$dat) exit("month ".mysql_error());
if(mysql_num_rows($dat) > 0)
{
$last_date = mysql_result($dat, 0);
$tmp1 = "putdate < '".date("Y-m-01 23:59:59", $last_date)."'";
$tmp2 = "";
// Общее число хитов
$query_hit_total = "SELECT SUM(hits_total)
FROM $tbl_arch_hits_month
WHERE ".$tmp1.$tmp2;
// Засчитанные хиты
$query_hit = "SELECT SUM(hits)
FROM $tbl_arch_hits_month
WHERE ".$tmp1.$tmp2;
// Подсчитываем число IP-адресов (хостов)
$query_host_total= "SELECT SUM(hosts_total)
FROM $tbl_arch_hits_month
WHERE ".$tmp1.$tmp2;
// Подсчитываем число уникальных посетителей за сутки
$query_host = "SELECT SUM(host)
FROM $tbl_arch_hits_month
WHERE ".$tmp1.$tmp2;
// Осуществляем запросы к базе данных
$tot_hit = mysql_query($query_hit_total);
if(!$tot_hit) exit(mysql_error());
$uni_hit = mysql_query($query_hit);
if(!$uni_hit) exit(mysql_error());
$tot_hst = mysql_query($query_host_total);
if(!$tot_hst) exit(mysql_error());
$uni_hst = mysql_query($query_host);
if(!$uni_hst) exit(mysql_error());
// Если запросы выполнениы удачно,
// получаем результат
$hits_total += mysql_result($tot_hit, 0);
$hits += mysql_result($uni_hit, 0);
$hosts_total += mysql_result($tot_hst, 0);
$hosts += mysql_result($uni_hst, 0);
}
}
// Возвращаем результат
return array($hits_total, $hits, $hosts_total, $hosts);
}
?>
|
Этот вновь полученный модуль я использую в своём PowerImage для извлечения из баз (зачем городить своё, если есть готовое?) трёх переменных:
// Функция возвращает массив из трёх переменных:
// количество хостов,
// количество засчитанных хитов и
// общее количества хитов.
После чего я генерирую картинку, где и вывожу эти три числа.
На текущий момент это
Просмотров всего: 527
Просмотров сегодня: 0
Посетителей всего: 411
Уникальных посетителей сегодня: 0
Никакие обновления старнички не помогают "выдернуть" из базы новые значения.
Но если я сейчас зайду на просмотр стастистики, то, во-первых, выижу, что сегодня уже было посещение 2006-08-21 06:48:57 и тут же обновляю страничку со своим примером: вижу
Просмотров всего: 536
Просмотров сегодня: 0
Посетителей всего: 420
Уникальных посетителей сегодня: 0
То есть, запуск просмотра статистики, производит какое-то действие над базами, после чего указанной функции становятся доступны достоверные данные.
Вот и хотелось бы провентилировать, что именно там может происходить? Чтобы мне не зарываться в чужой код, может это известно и лежит на поверхности.
Я понимаю, что базы и программа не предназначалась для использования баз вне собственной системы показа статистики. Но почему бы не предположить, что пользователям захочется воспользоваться результатами работы непосредственно самого счётчика count.php, без обращения к вашей системе статистики? А делая запрос непосредственно к базам и выводя только нужную информацию.
Могу ли я рассказать про ситуацию ещё как-то более подробно? | |
|
|
|
|
|
|
|
для: tuder
(21.08.2006 в 07:56)
| | Значит что-то вы напутали и берете данные только из архивной таблицы. | |
|
|
|
|
|
|
|
для: Loki
(21.08.2006 в 10:10)
| | Вот кусок кода, делающий выборку и использующий те функции. Символ в символ с аналогичным куском из hits.php, исключая убранные комментарии и исправленную опечатку.
//запрашиваем данные за текущие сутки
list($hits_total[0],
$hits[0],
$hosts_total[0],
$hosts[0])=show_ip_host_today($tbl_ip);
//запрашиваем данные за вчерашние сутки
list($hits_total[1],
$hits[1],
$hosts_total[1],
$hosts[1]) = show_ip_host($time[1]['begin'],
$time[1]['end'],
$tbl_arch_hits,
$tbl_arch_hits_month);
// запрашиваем данные за остальные периоды и
// прибавляем к ним данные за текущие сутки
for($i=2; $i<5; $i++)
{
list($hits_total[$i],
$hits[$i],
$hosts_total[$i],
$hosts[$i]) = show_ip_host($time[$i]['begin'],
$time[$i]['end'],
$tbl_arch_hits,
$tbl_arch_hits_month);
$hits_total[$i] +=$hits_total[0];
$hits[$i] +=$hits[0];
$hosts_total[$i] +=$hosts_total[0];
$hosts[$i] +=$hosts[0];
}
|
Если в hits.php написано
//запрашиваем данные за текущие сутки
то я считаю, что так оно и есть. И запрашивается именно из текущей базы.
//запрашиваем данные за вчерашние сутки
Это запрашивается из архивной
// запрашиваем данные за остальные периоды и
// прибавляем к ним данные за текущие сутки
как и это.
Вопрос. В какой момент происходит сброс в архив? Когда заходишь в админку/статистику. Так?
Да. Вот оно. Далеко запрятано. В admin/index.php стоит
// Включаем заголовок страницы
include "topcounter.php";
|
Казалось бы чего безобиднее, всего лишь заголовок. Но там
// Устанавливаем соединение с базой данных
require_once("config.php");
require_once("archive.php");
|
Что такое archive.php? О! Это же как раз архивация.
///////////////////////////////////////////////////
// Архивируем информацию в ежедневные таблицы
///////////////////////////////////////////////////
|
Поразмыслив, я теперь предполагаю, что функция show_ip_host_today($tbl_ip)
берёт из system_ip, по умолчанию, данные именно за текущую дату. Не трогая данные за предыдущие даты. Но эти данные ещё не сброшены в архив, так как админку никто не запускал.
В результате получается, что ни в текущей, ни в архивных базах не берётся данные за предыдущие, необработанные числа.
Да, выходит, что так оно и есть. Вот где собака порылась! :-)
// Запрос на статистику за текущий неархивированный день
$tmp1 = "putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL 1 DAY";
|
Спрашивается, зачем здесь ограничивать текущим неархивным днём, если при заходе в статистику всегда, однозначно, будет производится архивация данных? То есть их уже здесь не будет.
НО! А вот если по какой-то причине архивация не произошла, то всё, эти данные учитываться не будут вообще. Так как в архивных их нет, а из текущих они не берутся.
>Значит что-то вы напутали и берете данные только из архивной таблицы.
Так что ошибка - это у вас в логике программы. :-Ъ
Прийдётся править функцию, для работы с PowerImage. | |
|
|
|
|
|
|
|
для: Loki
(21.08.2006 в 10:10)
| | Кстати, нормальное ли это явление, что в system_ip, при такой статистике
<b>Засчитанные хосты
5 2 21 130 373
Хосты
6 2 23 141 425
Засчитанные хиты
5 2 24 155 520
Хиты
6 2 25 161 541</b>
находятся данные ещё за прошлый месяц? См. прикреплённый дамп базы.
Если я меняю в функции запрос
// Запрос на статистику за текущий неархивированный день
// $tmp1 = "putdate >= DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') - INTERVAL 1 DAY";
$tmp1= "TRUE";
|
То статистика резко меняется.
<b>Засчитанные хосты
121 2 137 246 489
Хосты
127 2 144 262 546
Засчитанные хиты
150 2 169 300 665
Хиты
163 2 182 318 698</b>
Это как раз выявляются "потерянные" хиты. Правда, все потерянные теперь попадают в "Сегодня", но общее количество-то становится реальным. | |
|
|
|
|
|
|
|
для: tuder
(21.08.2006 в 12:56)
| | Вся статистика кроме сегодняшнего дня берется из архивной таблицы, а текущие сутки из таблицы ip. В таблице ip данные хранятся за последний месяц. Так что никаких потеряных данных нет. | |
|
|
|
|
|
|
|
для: Loki
(21.08.2006 в 13:44)
| | Прикреплённый дамп смотрели?
Цитирую:
INSERT INTO `system_ip` VALUES("420", "1355377803", "2006-07-22 21:15:17", "6", "opera", "windows");
INSERT INTO `system_ip` VALUES("421", "1432330303", "2006-07-22 21:25:01", "2", "firefox", "windows");
INSERT INTO `system_ip` VALUES("422", "3639556744", "2006-07-23 17:57:14", "2", "msie", "windows");
INSERT INTO `system_ip` VALUES("423", "1360216614", "2006-07-24 07:10:33", "6", "msie", "robot_rambler");
INSERT INTO `system_ip` VALUES("424", "3272364970", "2006-07-24 15:48:53", "2", "msie", "windows");
INSERT INTO `system_ip` VALUES("425", "1209958676", "2006-07-24 21:44:53", "5", "mozilla", "none");
INSERT INTO `system_ip` VALUES("426", "3558934598", "2006-07-25 13:55:57", "6", "firefox", "windows");
INSERT INTO `system_ip` VALUES("427", "1439330645", "2006-07-25 19:30:01", "2", "mozilla", "windows");
|
Это за какой месяц данные в system_ip ?
А вот информация из system_arch_ip - смотрим по порядковым номерам записей...
INSERT INTO `system_arch_ip` VALUES("364", "2006-07-30 23:59:59", "1359298561", "1");
INSERT INTO `system_arch_ip` VALUES("365", "2006-07-30 23:59:59", "2112504245", "1");
INSERT INTO `system_arch_ip` VALUES("366", "2006-07-30 23:59:59", "3274603020", "1");
INSERT INTO `system_arch_ip` VALUES("367", "2006-07-30 23:59:59", "1049457425", "1");
INSERT INTO `system_arch_ip` VALUES("368", "2006-08-01 23:59:59", "1374850558", "1");
INSERT INTO `system_arch_ip` VALUES("369", "2006-08-01 23:59:59", "1209950858", "1");
INSERT INTO `system_arch_ip` VALUES("370", "2006-08-01 23:59:59", "1415450191", "1");
INSERT INTO `system_arch_ip` VALUES("371", "2006-08-02 23:59:59", "1370506090", "1");
INSERT INTO `system_arch_ip` VALUES("372", "2006-08-02 23:59:59", "1049457504", "1");
INSERT INTO `system_arch_ip` VALUES("373", "2006-08-02 23:59:59", "1433580451", "1");
INSERT INTO `system_arch_ip` VALUES("374", "2006-08-02 23:59:59", "1408042406", "1");
INSERT INTO `system_arch_ip` VALUES("375", "2006-08-02 23:59:59", "1439330645", "1");
INSERT INTO `system_arch_ip` VALUES("376", "2006-08-02 23:59:59", "1047068778", "1");
INSERT INTO `system_arch_ip` VALUES("377", "2006-08-03 23:59:59", "1406897237", "2");
INSERT INTO `system_arch_ip` VALUES("378", "2006-08-03 23:59:59", "3282142825", "1");
INSERT INTO `system_arch_ip` VALUES("379", "2006-08-03 23:59:59", "1370506090", "1");
INSERT INTO `system_arch_ip` VALUES("380", "2006-08-03 23:59:59", "1369809302", "1");
INSERT INTO `system_arch_ip` VALUES("381", "2006-08-03 23:59:59", "1360216585", "1");
INSERT INTO `system_arch_ip` VALUES("382", "2006-08-03 23:59:59", "3582071925", "1");
INSERT INTO `system_arch_ip` VALUES("383", "2006-08-04 23:59:59", "1374983517", "1");
INSERT INTO `system_arch_ip` VALUES("384", "2006-08-04 23:59:59", "3562210002", "1");
INSERT INTO `system_arch_ip` VALUES("385", "2006-08-04 23:59:59", "3642185765", "1");
INSERT INTO `system_arch_ip` VALUES("386", "2006-08-04 23:59:59", "1427093229", "1");
INSERT INTO `system_arch_ip` VALUES("387", "2006-08-05 23:59:59", "1415538283", "1");
INSERT INTO `system_arch_ip` VALUES("388", "2006-08-06 23:59:59", "1408103942", "1");
INSERT INTO `system_arch_ip` VALUES("389", "2006-08-06 23:59:59", "3416260903", "1");
INSERT INTO `system_arch_ip` VALUES("390", "2006-08-07 23:59:59", "2887090793", "1");
INSERT INTO `system_arch_ip` VALUES("391", "2006-08-08 23:59:59", "1433695746", "1");
INSERT INTO `system_arch_ip` VALUES("392", "2006-08-09 23:59:59", "1360216614", "1");
INSERT INTO `system_arch_ip` VALUES("393", "2006-08-09 23:59:59", "3264186620", "1");
INSERT INTO `system_arch_ip` VALUES("394", "2006-08-09 23:59:59", "1439330645", "1");
INSERT INTO `system_arch_ip` VALUES("395", "2006-08-09 23:59:59", "1464093996", "1");
INSERT INTO `system_arch_ip` VALUES("396", "2006-08-11 23:59:59", "1374981438", "1");
INSERT INTO `system_arch_ip` VALUES("397", "2006-08-12 23:59:59", "1347958488", "1");
INSERT INTO `system_arch_ip` VALUES("398", "2006-08-12 23:59:59", "1209950858", "1");
INSERT INTO `system_arch_ip` VALUES("399", "2006-08-12 23:59:59", "1374979581", "1");
INSERT INTO `system_arch_ip` VALUES("400", "2006-08-13 23:59:59", "1374979581", "1");
INSERT INTO `system_arch_ip` VALUES("401", "2006-08-13 23:59:59", "1431872140", "1");
INSERT INTO `system_arch_ip` VALUES("402", "2006-08-14 23:59:59", "2112504501", "1");
INSERT INTO `system_arch_ip` VALUES("403", "2006-08-15 23:59:59", "1425147488", "1");
INSERT INTO `system_arch_ip` VALUES("404", "2006-08-15 23:59:59", "1439330645", "1");
INSERT INTO `system_arch_ip` VALUES("405", "2006-08-15 23:59:59", "1370506090", "1");
INSERT INTO `system_arch_ip` VALUES("406", "2006-08-16 23:59:59", "3377426402", "1");
INSERT INTO `system_arch_ip` VALUES("407", "2006-08-16 23:59:59", "1047373624", "1");
INSERT INTO `system_arch_ip` VALUES("408", "2006-08-16 23:59:59", "1441366273", "1");
INSERT INTO `system_arch_ip` VALUES("409", "2006-08-17 23:59:59", "3251358235", "3");
INSERT INTO `system_arch_ip` VALUES("410", "2006-08-17 23:59:59", "1415493506", "1");
INSERT INTO `system_arch_ip` VALUES("411", "2006-08-18 23:59:59", "1422672499", "1");
INSERT INTO `system_arch_ip` VALUES("412", "2006-08-18 23:59:59", "1051013542", "1");
INSERT INTO `system_arch_ip` VALUES("413", "2006-08-18 23:59:59", "3286948982", "1");
INSERT INTO `system_arch_ip` VALUES("414", "2006-08-18 23:59:59", "1346825253", "1");
INSERT INTO `system_arch_ip` VALUES("415", "2006-08-18 23:59:59", "1408098457", "1");
INSERT INTO `system_arch_ip` VALUES("416", "2006-08-19 23:59:59", "3648409353", "1");
INSERT INTO `system_arch_ip` VALUES("417", "2006-08-19 23:59:59", "1435360158", "1");
INSERT INTO `system_arch_ip` VALUES("418", "2006-08-20 23:59:59", "1446619534", "1");
INSERT INTO `system_arch_ip` VALUES("419", "2006-08-20 23:59:59", "1435360192", "1");
|
| |
|
|
|
|
|
|
|
для: tuder
(09.06.2006 в 09:20)
| | Я использовал стандартные функии Power Counter, которые используються при отображении страницы "Хосты и хиты" | |
|
|
|
|
|
|
|
для: @ndry
(13.06.2006 в 15:48)
| | ? Для чего использовал?
Из hits.php ? Так и я их же. Только выдрал в отдельный файл. | |
|
|
|
|