Принцип работы...

Статус
Закрыто для дальнейших ответов.

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
Всем привет... делаю сайт-каталог софта... интересует один вопрос: как осуществить слежение за количеством скачиваний программы за день/неделю/месяц... пишу на ПХП и МуСКьюЛ... код мне не нужен, а нужен лишь сам принцип подсчета... соображения есть, нохочется послушать ваши предложения...
Спасибо...
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
день/неделю/месяц..
Хм, а ты уверен, что это тебе надо? Это же лишние ресурсы, одумайся пока не поздно.

как осуществить слежение за количеством скачивании программы
Лучше учитывать общее число загрузок. Вот те моя логика:

1) Делаешь страницу редирект
2) Передаешь ей "id" проги на скачку
3) Увеличиваем счетчик загрузок и получает из БД фактический адрес проги
4) Отправляем заголовок "Location: путь"
5) Происходит перенаправление.
6) Прога качается

Я думаю все понятно. Если нет, то спрашивай, не стесняйся;)
 

DnAp

self::setDebugMode(true);
Регистрация
30.04.2005
Сообщения
490
ИМХО
Можно чуть сэкономить если создать табичку с такой структурой:
ID_prog - без коментария
date - дата типа DATE
num - типа INT содежит сколько скачали за этот день...

Собственно проблемма понятна, жалко столько ресурсов тратить?
Держать инфу боюсь в другом виде будет менее эффективно...
так-же можно через год инфу сжимать и при запросе разпаковывать... чтоб бд не заваливать...
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
2DnAp На самом деле я вообще не вижу смысла вести учет по "день/неделя/месяц". ИМХО.
И выделять еще 1 таблицу для подсчета, это имеет смысл только для подсчета того, что он сказал.

2Tsatur А ты уверен, что тебе надо именно это?
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
DnAp сказал(а):
ИМХО
Можно чуть сэкономить если создать табичку с такой структурой:
ID_prog - без коментария
date - дата типа DATE
num - типа INT содежит сколько скачали за этот день...

Собственно проблемма понятна, жалко столько ресурсов тратить?
Интересный ты... а ну напиши алгоритм, как посчитать количество скачиваний с этими 3 полями....

Creator сказал(а):
2Tsatur А ты уверен, что тебе надо именно это?
По-моему любой уважающий себя каталог софта имеет следующее: лучшая программа за день/неделю/месяц... именно по скачиваниям это и определяется... а теперь вопрос: хочу я создать нормальный сайт или буду конкурировать с народовскими "каталогами софта"? :megalol:
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
2Tsatur Основной алгоритм я тебе писал:)

1) Делаешь страницу редирект
2) Передаешь ей "id" проги на скачку
3) Увеличиваем счетчик загрузок и получает из БД фактический адрес проги
4) Отправляем заголовок "Location: путь"
5) Происходит перенаправление.
6) Прога качается
Коли ты хочешь вести по нескольким позициям, т.е. дням/неделям/месяцам, придется тебе мудришь с 3-м пунктом. А насчет работы со строением таблицы DnAp'a, тут все очень просто: при скачивании проги, у тебя просто сравнивается дата, если дата отличается, то устанавливается новая и обнуляется счетчик, если нет, то счетчик увеличивается на 1:)
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
Вот, вот, этот принцип я то знаю... и наврно другого и нет...

Ладно, тогда подскажите, как висчитывать лучше, недели и месяцы... с днями понятно, а вот дальше сложнее... мда, хотя месяцы тоже несложно... :)
 

DnAp

self::setDebugMode(true);
Регистрация
30.04.2005
Сообщения
490
Интересная мысль... Извлеч терь это все... ХМ...
Идея уе почти сформировалась....
юзать что-нить
select max(sum_num) from (
SELECT sum(NUM) from table ... where (ограничить одной неделей)
)
ограничить одной неделей - тут делать GROUP...
вобщем если мысль не понятна подожди 1-2 дня... если не горит конечно...
Обязательно выберу время, а то под рукой даж mysql нету... а ms с датами не пашет:(
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
Я уже все сделал :) Но, мне интересно, что предложите вы... могу попозже выложить свой результат...
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Нда... предложений уйма...
Но для того, что бы тема все же состоялась, просим выложить решение данной проблемы. :thumbsup:
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
Код:
function AddDownLoad($id){
		$connect_id=mysql_connect($GLOBALS["mysql_host"],$GLOBALS["mysql_username"],
$GLOBALS["mysql_password"])or die("Íå ìîãó ïîäêëþ÷èòüñÿ ê õîñòó");
		mysql_select_db($GLOBALS["mysql_dbname"],$connect_id)or die("Íå ìîãó ïîäêëþ÷èòüñÿ ê ÁÄ");
		$query="SELECT downloads_today,today_dl,downloads_week,downloads_month,downloads FROM programs WHERE id=$id";
		$result=mysql_query($query,$connect_id);
		$result=mysql_fetch_row($result);
		$downloads=$result[4];
		$downloads_today=$result[0];
		$downloads_week=$result[2];
		$downloads_month=$result[3];
		$today=$result[1];
		$time=time();
		if($today==0){$today=$time;}

		$downloads++;
		if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("n",$today)==(int)date("n",$time)&&
(int)date("j",$today)==(int)date("j",$time)){$downloads_today++;}else{$downloads_today=1;}
		if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("W",$today)==(int)date("W",$time))
{$downloads_week++;}else{$downloads_week=1;}
		if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("n",$today)==(int)date("n",$time))
{$downloads_month++;}else{$downloads_month=1;}

		$query="UPDATE programs SET downloads=$downloads,downloads_today=$downloads_today,today_dl=$time,
downloads_week=$downloads_week,downloads_month=$downloads_month WHERE id=$id";
		mysql_query($query,$connect_id);
		mysql_close($connect_id);
}

function AddPreview($id){
		$connect_id=mysql_connect($GLOBALS["mysql_host"],$GLOBALS["mysql_username"],
$GLOBALS["mysql_password"])or die("Íå ìîãó ïîäêëþ÷èòüñÿ ê õîñòó");
		mysql_select_db($GLOBALS["mysql_dbname"],$connect_id)or die("Íå ìîãó ïîäêëþ÷èòüñÿ ê ÁÄ");
		$query="SELECT preview_today,today_pr,preview_week,preview_month,preview FROM programs WHERE id=$id";
		$result=mysql_query($query,$connect_id);
		$result=mysql_fetch_row($result);
		$preview=$result[4];
		$preview_today=$result[0];
		$preview_week=$result[2];
		$preview_month=$result[3];
		$today=$result[1];
		$time=time();
		if($today==0){$today=$time;}

		$preview++;
		if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("n",$today)==(int)date("n",$time)&&
(int)date("j",$today)==(int)date("j",$time)){$preview_today++;}else{$preview_today=1;}
		if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("W",$today)==(int)date("W",$time))
{$preview_week++;}else{$preview_week=1;}
		if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("n",$today)==(int)date("n",$time))
{$preview_month++;}else{$preview_month=1;}

		$query="UPDATE programs SET preview=$preview,preview_today=$preview_today,today_pr=$time,
preview_week=$preview_week,preview_month=$preview_month WHERE id=$id";
		mysql_query($query,$connect_id);
		mysql_close($connect_id);
}
Вот собственно и все... может и коряво, но работает... :thumbup:
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Ни в коем случае не думай, что я придираюсь, просто я подумал на досуге и решил предложить свою логику основных вычислений.. она несколько проще:) ИМХО замутил ты ее сильно.:)

Код:
if(date('y',$today)===date('y',time()))
{
    if(date('m',$today)===date('m',time())) $downloads_month++;
    else $downloads_month=1;

    if(date('W',$today)===date('W',time())) $downloads_week++;
    else $downloads_week=1;

    if(date('d',$today)===date('d',time())) $downloads_today++;
    else $downloads_today=1;
}
else
{
    $downloads_month=1;
    $downloads_week=1;
    $downloads_today=1;
}
Вместо

Код:
if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("n",$today)==(int)date("n",$time)&&
(int)date("j",$today)==(int)date("j",$time)){$downloads_today++;}else{$downloads_today=1;}
if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("W",$today)==(int)date("W",$time))
{$downloads_week++;}else{$downloads_week=1;}
if((int)date("Y",$today)==(int)date("Y",$time)&&(int)date("n",$today)==(int)date("n",$time))
{$downloads_month++;}else{$downloads_month=1;}
Если тебе понравился мой вариант, то юзай на здоровье;)
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
Не... плохой код :)
А вдруг прогу не скачивали месяц? Допустим, скачали 10 мая, следующий раз скачали 10 апреля... твой код будет добавлять скачивания за день :) Такая же ситуация и с месяцами, если прогу не скачивали год :)

А вообще я этот код уже убрал... использую крон :)
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
А вдруг прогу не скачивали месяц? Допустим, скачали 10 мая, следующий раз скачали 10 апреля... твой код будет добавлять скачивания за день :) Такая же ситуация и с месяцами, если прогу не скачивали год :)
Гы, я тут просто ошибся с индексом date('z',$today). А так все нормуль, то что ты мне сказал - это я отслеживаю... :)

Код:
if(date('y',$today)===date('y',time()))
{
   if(date('m',$today)===date('m',time())) $downloads_month++;
   else $downloads_month=1;

   if(date('W',$today)===date('W',time())) $downloads_week++;
   else $downloads_week=1;

   if(date('z',$today)===date('z',time())) $downloads_today++;
   else $downloads_today=1;
}
else
{
   $downloads_month=1;
   $downloads_week=1;
   $downloads_today=1;
}
А вообще я этот код уже убрал... использую крон :)
Поясни плиз.
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
По поводу крона...
Я создал 3 файлика, которые соответственно отвечают за обнуление дней, недели и месяца.... и все :) В кроне выставил выполнение одного файла 1 раз в день в 00.00, другого раз в неделю, 3 - в месяц....
 

mrM

Адекватный критик
Регистрация
11.06.2005
Сообщения
90
To: Tsatur Весьма рациональный способ. Требует минимум ресурсов, но если тебе не хочется вазиться в куче файлов, в которых можно напросто потеряться, то способ Creator'a тоже хорош. Т.е. основная логика.)

З.Ы. тогда уж не несколко файлов делал, а 1, но которому передавался определенный параметр, типа "cron.php?type=day" или "cron.php?type=month"
 

Tsatur

Well-Known Member
Регистрация
15.05.2005
Сообщения
96
mr. M сказал(а):
З.Ы. тогда уж не несколко файлов делал, а 1, но которому передавался определенный параметр, типа "cron.php?type=day" или "cron.php?type=month"
[post="812"][/post]​
Логично... просто я написал выход из положения путем использования крона... времени нет особо думать, сессия... :)
Но по поводу одного файла - так и сделаю....
 
Статус
Закрыто для дальнейших ответов.
Верх Низ