Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Power Counter. Выгрузка данных
 
 автор: Loki   (09.09.2005 в 22:10)   письмо автору
 
 

Набросал скелет скрипта для выгрузки данных. Пока работает только для недель для отчета 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;

Правда, пока в таблицу ничего не пишется... только запросы на экран выводит.

   
 
 автор: cheops   (10.09.2005 в 00:10)   письмо автору
 
   для: Loki   (09.09.2005 в 22:10)
 

Я тоже думал на счёт этого и тоже пришёл к выводу, что с ежедневной выгрузкой будет гораздо удобнее (почасовую динамику сохранять скажем только за неделю) - это немного уменьшит точность, но съэкономит место - Rambler так же поступает - у него месячные данные поэтому завышены.

Забираю на тестирование.

   
 
 автор: cheops   (10.09.2005 в 01:34)   письмо автору
 
   для: Loki   (09.09.2005 в 22:10)
 

А как данные в таблицу arch_hits попадают?

   
 
 автор: Loki   (10.09.2005 в 17:12)   письмо автору
 
   для: cheops   (10.09.2005 в 01:34)
 

Пока никак. Просто вывожу запросы на экран чтобы отлаживать удобнее было.
Так я так понял выгружаем данные ежедневно, а данные в таблице ip храним только за неделю? если так, то все еще упрощается.

   
 
 автор: cheops   (10.09.2005 в 20:25)   письмо автору
 
   для: Loki   (10.09.2005 в 17:12)
 

Да, иначе всё слишком усложняется...

   
 
 автор: Loki   (10.09.2005 в 23:07)   письмо автору
 
   для: 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;

Теперь осталось решить как оформить вывод данных. Самый простой вариант - просто таблица за весь период. Какие есть еще предложения?

   
 
 автор: cheops   (11.09.2005 в 01:21)   письмо автору
 
   для: Loki   (10.09.2005 в 23:07)
 

Давайте за весь период, потом всё-равно таблицу с суточной статистикой будем чистить - как только она за два месяца залезет. А вот эта таблица arch_hits - она для чего дня дней?

   
 
 автор: Loki   (11.09.2005 в 13:00)   письмо автору
 
   для: cheops   (11.09.2005 в 01:21)
 

Я имел ввиду само оформление: в тех же "взрослых" счетчиков данные выводятся по месяцам, с подсветкой самых больших цифр за месяц. В общем-то это все решаемо, но надо просто подумать что бы мы хотели видеть.

>таблица arch_hits - она для чего дня дней?
Мы же вроде решили выгружать только дни: какой смысл выгружать дополнительно недели и месяцы, если их можно сформировать из 7-30 имеющихся записей?
То есть мы выгружаем ежедневные данные, а в отчетах формируем данные запросами WHERE putdate > NOW() - INTERVAL 7 DAY, после чего, прибавляем данные за текущий день. А данные в таблице ip храним, например, за последний месяц, чтобы можно было просматривать отчет pages.php (для всех остальных отчетов будут заведены собственные таблицы)
Либо, формировать отчеты по данным за последний месяц (кроме столбца "весь период"). В этом случае мы можем учитывать информацию по конкретной странице.

   
 
 автор: cheops   (11.09.2005 в 13:04)   письмо автору
 
   для: Loki   (11.09.2005 в 13:00)
 

Ну т.е. в каждой записи таблицы arch_hits хранятся данные за одни сутки?

   
 
 автор: Loki   (11.09.2005 в 17:26)   письмо автору
 
   для: cheops   (11.09.2005 в 13:04)
 

Совершенно верно.
Вот так это работает сейчас.

   
 
 автор: cheops   (14.09.2005 в 01:47)   письмо автору
 
   для: Loki   (11.09.2005 в 17:26)
 

Пытаюсь прикрутить выборку, вот этот блок что означает?
<?php
 
// если запуск первый
 
if ($last_date==NULL)
 {
 
$last_date=$date['data'];
 echo 
"test";
 }
?>

Массив $date до этого не встречается вроде... или это можно удалить?

   
 
 автор: cheops   (14.09.2005 в 03:03)   письмо автору
 
   для: cheops   (14.09.2005 в 01:47)
 

Так $date нашёл в topcounter.php :), а чем $last_day отличается от $last_date - у меня почему то получается дикая разница и скрипт норовит пару десятков тысяч записей вставить :)))

   
 
 автор: Loki   (14.09.2005 в 09:25)   письмо автору
 
   для: 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 года:) В этом случае, придется придумывать другое условие:)

   
 
 автор: cheops   (14.09.2005 в 12:53)   письмо автору
 
   для: Loki   (14.09.2005 в 09:25)
 

Да сегодня продолжу разбирать... просто я ещё на несколько сайтов пытаюсь обощить - скорее всего из-за этого глюки лезут :) Наверное нужно будет ввести защиту от 1970 года :), а то после такого сбоя нашими скриптами никто пользоваться не будет :)))

   
 
 автор: Loki   (14.09.2005 в 13:28)   письмо автору
 
   для: cheops   (14.09.2005 в 12:53)
 

можно сделать такую проверку:

<?
if ($last_date<=$date['date']) $last_date=$date['date'];
?>


А по поводу нескольких сайтов что имеется ввиду?
Я обращал внимание что заложена возможность мониторинга нескольких сайтов (правда, она не реальизована и мне не очень ясна польза от нее:). Речь об этом?

   
 
 автор: cheops   (14.09.2005 в 19:35)   письмо автору
 
   для: Loki   (14.09.2005 в 13:28)
 

Да имеется несколько сайта, просто при работе с HTML-сайтом может быть более удобный вариант внешнего счётчика, также удобнее работать с ним если есть необходимость поддержки сразу нескольких сайтов.

   
 
 автор: Loki   (14.09.2005 в 23:13)   письмо автору
 
   для: cheops   (14.09.2005 в 19:35)
 

В общем, жду результатов тестирования. Если основных тараканов выловим, то на основе этого кода буду делать выгрузку для остальных отчетов.

   
 
 автор: cheops   (15.09.2005 в 02:55)   письмо автору
 
   для: 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($hst0);
    
$hits      += mysql_result($pht0);
    
$totalhist += mysql_result($tot0);
  }

  
// Если требуемый интервал затрагивает дни, упакованные в таблицы
  // плюс ко всему извлекаем информацию из архивной таблицы $tbl_arch_hits
  
if($begin != 1)
  {
    ...
    
// Если запросы выполнениы удачно,
    // получаем результат
    
$hosts     += mysql_result($hst0);
    
$hits      += mysql_result($pht0);
    
$totalhist += mysql_result($tot0);
  }

  
// Возвращаем результат
  
return array($hosts$hits$totalhist);
}
?>

К сожалению, это всё пока не совместимо с PowerCounter, так как у внешнего счётчика отсутствует понятие "засчитанные хосты" и присутсвует понятия нескольких сайтов, но после того как механизмы будут отлажены - перенос уже не будет представлять труда.

   
 
 автор: cheops   (15.09.2005 в 02:58)   письмо автору
 
   для: cheops   (15.09.2005 в 02:55)
 

А ещё во внешнем счётчике у меня таблицы с переменными именами... это нужно будет тоже в третьей версии организовать, а то уж больно имена таблиц распространнённые используются...

   
 
 автор: Loki   (15.09.2005 в 10:08)   письмо автору
 
   для: cheops   (15.09.2005 в 02:58)
 

Да. Я тоже уже с этим сталкивался.
Со скелетом функции согласен: именно так я и собирался это сделать. Но есть трудность: если запрашиваются данные по конкретной странице, но надо бы их брать из ip, так как arch_ip не делает различий и все валит в кучу. Данные будут только за последний месяц, но это больше чем ничего.
Надо ли все это выделять в отдельную функцию - не знаю, так как вызываться она будет только из одного места.

По п.1: это я перестраховался. Побоялся что вдруг где-нить при вычислениях вылезет лишняя секунда -заархивируем дополнительный день:)

3. Я и не знал что так можно - здорово! надо будет еще где-нибудь использовать:)

Для внешнего счетчика, вероятно, тупо приравнивать засчитанные хосты ко всем хостам... или вообще их не показывать. В любом случае, я не очень представляю как работает внешний счетчик.

   
 
 автор: cheops   (15.09.2005 в 13:08)   письмо автору
 
   для: Loki   (15.09.2005 в 10:08)
 

Да со страницами проблема имеется... ну не будем показывать данные за всё время - в конце концов, оптимизация скорости и места требуют жертв :)))

>Для внешнего счетчика, вероятно, тупо приравнивать засчитанные хосты ко всем
>хостам... или вообще их не показывать. В любом случае, я не очень представляю
>как работает внешний счетчик.
А у него и нет незасчитанных хостов - внешний счётчик это картинка - её грузят с сервера-счётчика и пока он её формирует и отсылает клиенту от учытывает кто к нему обратился. Роботы картинки не грузят (клиенты-то не все грузят :), поэтому у внешних счётчиков только хосты (и то не полностью). Грубо говоря PowerCounter даёт 1500 чистых хостов и 1650 грязных, а тот же Rambler даст 1100, т.е. подсчёт идёт для тех, кто грузит картинки.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования