|
|
|
| Набросал скелет скрипта для выгрузки данных. Пока работает только для недель для отчета main.php. Если сделаем для месяцев, то на его основе можно довольно быстро сделать все остальные. В процессе работы, выозникла мысль, что неплохо бы сделать и ежедневную выгрузку. При этом данные получатся более динамичные...
Сейчас подумалось: а можyо и вообще сделать только ежедневную, а на ее основе формировать недельную и месячную. В общем, я на распутье.
Сечас же у меня трудность следующая: как подсчитать количество месяцев прошедших с определенной даты и до первого числа текущего месяца?
Файл прилагаю.
Структура таблицы:
CREATE TABLE arch_hits (
id_ip int(3) NOT NULL auto_increment,
'date' datetime NOT NULL default '0000-00-00 00:00:00',
'hosts' int(11) NOT NULL default '0',
hosts_total int(11) NOT NULL default '0',
hits int(11) NOT NULL default '0',
period enum('week','month','year') NOT NULL default 'week',
PRIMARY KEY (id_ip)
) TYPE=MyISAM;
|
Правда, пока в таблицу ничего не пишется... только запросы на экран выводит. | |
|
|
|
|
|
|
|
для: Loki
(09.09.2005 в 22:10)
| | Я тоже думал на счёт этого и тоже пришёл к выводу, что с ежедневной выгрузкой будет гораздо удобнее (почасовую динамику сохранять скажем только за неделю) - это немного уменьшит точность, но съэкономит место - Rambler так же поступает - у него месячные данные поэтому завышены.
Забираю на тестирование. | |
|
|
|
|
|
|
|
для: Loki
(09.09.2005 в 22:10)
| | А как данные в таблицу arch_hits попадают? | |
|
|
|
|
|
|
|
для: cheops
(10.09.2005 в 01:34)
| | Пока никак. Просто вывожу запросы на экран чтобы отлаживать удобнее было.
Так я так понял выгружаем данные ежедневно, а данные в таблице ip храним только за неделю? если так, то все еще упрощается. | |
|
|
|
|
|
|
|
для: Loki
(10.09.2005 в 17:12)
| | Да, иначе всё слишком усложняется... | |
|
|
|
|
|
|
|
для: cheops
(10.09.2005 в 20:25)
| | Тогда код выгдядит так.
Таблица несколько упростилась:
CREATE TABLE arch_hits (
id_ip int(3) NOT NULL auto_increment,
'date' datetime NOT NULL default '0000-00-00 00:00:00',
'hosts' int(11) NOT NULL default '0',
hosts_total int(11) NOT NULL default '0',
hits int(11) NOT NULL default '0',
PRIMARY KEY (id_ip)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
|
Теперь осталось решить как оформить вывод данных. Самый простой вариант - просто таблица за весь период. Какие есть еще предложения? | |
|
|
|
|
|
|
|
для: Loki
(10.09.2005 в 23:07)
| | Давайте за весь период, потом всё-равно таблицу с суточной статистикой будем чистить - как только она за два месяца залезет. А вот эта таблица arch_hits - она для чего дня дней? | |
|
|
|
|
|
|
|
для: cheops
(11.09.2005 в 01:21)
| | Я имел ввиду само оформление: в тех же "взрослых" счетчиков данные выводятся по месяцам, с подсветкой самых больших цифр за месяц. В общем-то это все решаемо, но надо просто подумать что бы мы хотели видеть.
>таблица arch_hits - она для чего дня дней?
Мы же вроде решили выгружать только дни: какой смысл выгружать дополнительно недели и месяцы, если их можно сформировать из 7-30 имеющихся записей?
То есть мы выгружаем ежедневные данные, а в отчетах формируем данные запросами WHERE putdate > NOW() - INTERVAL 7 DAY, после чего, прибавляем данные за текущий день. А данные в таблице ip храним, например, за последний месяц, чтобы можно было просматривать отчет pages.php (для всех остальных отчетов будут заведены собственные таблицы)
Либо, формировать отчеты по данным за последний месяц (кроме столбца "весь период"). В этом случае мы можем учитывать информацию по конкретной странице. | |
|
|
|
|
|
|
|
для: Loki
(11.09.2005 в 13:00)
| | Ну т.е. в каждой записи таблицы arch_hits хранятся данные за одни сутки? | |
|
|
|
|
|
|
|
для: cheops
(11.09.2005 в 13:04)
| | Совершенно верно.
Вот так это работает сейчас. | |
|
|
|
|
|
|
|
для: Loki
(11.09.2005 в 17:26)
| | Пытаюсь прикрутить выборку, вот этот блок что означает?
<?php
// если запуск первый
if ($last_date==NULL)
{
$last_date=$date['data'];
echo "test";
}
?>
|
Массив $date до этого не встречается вроде... или это можно удалить? | |
|
|
|
|
|
|
|
для: cheops
(14.09.2005 в 01:47)
| | Так $date нашёл в topcounter.php :), а чем $last_day отличается от $last_date - у меня почему то получается дикая разница и скрипт норовит пару десятков тысяч записей вставить :))) | |
|
|
|
|
|
|
|
для: cheops
(14.09.2005 в 03:03)
| | $last_day - это последний завершенный день
$last_date - последняя дата выгрузки.
Если небыло ни одной выгрузки, то sql запрос вместо даты возвращает NULL (во всяком случае у меня). В этом случае, в качестве $last_date мы берем $date - то есть дату запуска счетчика.
Проверьте, возвращает ли запрос
SELECT UNIX_TIMESTAMP(MAX('date')) as 'date' FROM arch_hits
|
NULL в случае отсутствия архивных записей. Если этого не происходит, то скрипт будет пытаться делать выгрузки до 1970 года:) В этом случае, придется придумывать другое условие:) | |
|
|
|
|
|
|
|
для: Loki
(14.09.2005 в 09:25)
| | Да сегодня продолжу разбирать... просто я ещё на несколько сайтов пытаюсь обощить - скорее всего из-за этого глюки лезут :) Наверное нужно будет ввести защиту от 1970 года :), а то после такого сбоя нашими скриптами никто пользоваться не будет :))) | |
|
|
|
|
|
|
|
для: cheops
(14.09.2005 в 12:53)
| | можно сделать такую проверку:
<?
if ($last_date<=$date['date']) $last_date=$date['date'];
?>
|
А по поводу нескольких сайтов что имеется ввиду?
Я обращал внимание что заложена возможность мониторинга нескольких сайтов (правда, она не реальизована и мне не очень ясна польза от нее:). Речь об этом? | |
|
|
|
|
|
|
|
для: Loki
(14.09.2005 в 13:28)
| | Да имеется несколько сайта, просто при работе с HTML-сайтом может быть более удобный вариант внешнего счётчика, также удобнее работать с ним если есть необходимость поддержки сразу нескольких сайтов. | |
|
|
|
|
|
|
|
для: cheops
(14.09.2005 в 19:35)
| | В общем, жду результатов тестирования. Если основных тараканов выловим, то на основе этого кода буду делать выгрузку для остальных отчетов. | |
|
|
|
|
|
|
|
для: Loki
(14.09.2005 в 23:13)
| | Я пока побоялся портить основной PowerCounter на сайте и колдую над внешним счётчиком.
1) Мне не понравился момент
<?php
if (intval(($last_day - $last_date)/24/60/60))
{
$days = ceil(($last_day-$last_date)/24/60/60);
?>
|
у меня чего-то криво работает, заменил на
<?php
if (ceil(($last_day - $last_date)/24/60/60))
{
$days = ceil(($last_day-$last_date)/24/60/60);
?>
|
2) Переименовал поле date в putdate, так как могут быть проблемы, особенно с phpMyAdmin, да и в других таблицах putdate используется.
3) Решил изменить добавление в таблицу arch_hits, преобразовав несколько одиночных INSERT-запросов в один многострочный, т.е. в цикле помещаю в массив данные
<?php
$sql[] = "(0, '".date("Y-m-d H:i:s",$last_day)."' - INTERVAL ".($i-1)." DAY, $hosts, $hists, $totalhists, $_GET[id_user])";
?>
|
а потом формирую запрос при помощи implode
<?php
$query = "INSERT INTO $tbl_arch_hits VALUES".implode(",", $sql);
?>
|
4) Вычисление $date['data'] решил продублировать в коде, а не пологаться на topcounter.php, так как со временем код будет использоваться для автоматической работы - он должен быть автономным.
А так вообще всё работает как часы - всё вставляется, удаляется - классная штука. Нужно будет только с функциями представления поработать. Скелет функции show_ip_host решил сделать следующим
<?php
function show_ip_host($begin, $end, $id_user, $tbl_ip, $tbl_arch_hits)
{
// Обнуляем хиты и хосты
$hosts = 0;
$hits = 0;
$totalhist = 0;
// Определяем принадлежность сата
$user = " AND id_user=$id_user";
/////////////////////////////////////////////////////////////////////////////
// Исходим из таблицы соответствия
// begin end
// сегодня 1 0 - это извлекаем из $tbl_ip
// вчера 2 1 - это извлекаем из $tbl_arch_hits
// неделя 7 0 - это извлекаем из $tbl_arch_hits
// месяц 30 0 - это извлекаем из $tbl_arch_hits
// всё время 0 0 - это извлекаем из $tbl_arch_hits
/////////////////////////////////////////////////////////////////////////////
// Если учёт происходит вплоть до сегодняшнего дня - учитываем это, обращаясь
// к текущим хитам и хостам в таблице $tbl_ip
if($end == 0)
{
...
// Если запросы выполнениы удачно,
// получаем результат
$hosts += mysql_result($hst, 0);
$hits += mysql_result($pht, 0);
$totalhist += mysql_result($tot, 0);
}
// Если требуемый интервал затрагивает дни, упакованные в таблицы
// плюс ко всему извлекаем информацию из архивной таблицы $tbl_arch_hits
if($begin != 1)
{
...
// Если запросы выполнениы удачно,
// получаем результат
$hosts += mysql_result($hst, 0);
$hits += mysql_result($pht, 0);
$totalhist += mysql_result($tot, 0);
}
// Возвращаем результат
return array($hosts, $hits, $totalhist);
}
?>
|
К сожалению, это всё пока не совместимо с PowerCounter, так как у внешнего счётчика отсутствует понятие "засчитанные хосты" и присутсвует понятия нескольких сайтов, но после того как механизмы будут отлажены - перенос уже не будет представлять труда. | |
|
|
|
|
|
|
|
для: cheops
(15.09.2005 в 02:55)
| | А ещё во внешнем счётчике у меня таблицы с переменными именами... это нужно будет тоже в третьей версии организовать, а то уж больно имена таблиц распространнённые используются... | |
|
|
|
|
|
|
|
для: cheops
(15.09.2005 в 02:58)
| | Да. Я тоже уже с этим сталкивался.
Со скелетом функции согласен: именно так я и собирался это сделать. Но есть трудность: если запрашиваются данные по конкретной странице, но надо бы их брать из ip, так как arch_ip не делает различий и все валит в кучу. Данные будут только за последний месяц, но это больше чем ничего.
Надо ли все это выделять в отдельную функцию - не знаю, так как вызываться она будет только из одного места.
По п.1: это я перестраховался. Побоялся что вдруг где-нить при вычислениях вылезет лишняя секунда -заархивируем дополнительный день:)
3. Я и не знал что так можно - здорово! надо будет еще где-нибудь использовать:)
Для внешнего счетчика, вероятно, тупо приравнивать засчитанные хосты ко всем хостам... или вообще их не показывать. В любом случае, я не очень представляю как работает внешний счетчик. | |
|
|
|
|
|
|
|
для: Loki
(15.09.2005 в 10:08)
| | Да со страницами проблема имеется... ну не будем показывать данные за всё время - в конце концов, оптимизация скорости и места требуют жертв :)))
>Для внешнего счетчика, вероятно, тупо приравнивать засчитанные хосты ко всем
>хостам... или вообще их не показывать. В любом случае, я не очень представляю
>как работает внешний счетчик.
А у него и нет незасчитанных хостов - внешний счётчик это картинка - её грузят с сервера-счётчика и пока он её формирует и отсылает клиенту от учытывает кто к нему обратился. Роботы картинки не грузят (клиенты-то не все грузят :), поэтому у внешних счётчиков только хосты (и то не полностью). Грубо говоря PowerCounter даёт 1500 чистых хостов и 1650 грязных, а тот же Rambler даст 1100, т.е. подсчёт идёт для тех, кто грузит картинки. | |
|
|
|