Перейти к публикации

Защитывание просмотра новости только 1 раз с одного ип в сутки


Рекомендованные сообщения

keiZ,

В споре не главное кто что проигрывает, а главное кто что выигрывает, вы выигрываете 59$ и я выигрываю 59$. В этом и заключается интерес споров, когда каждый расчитывает на свой выигрыш, а не на свой проигрыш, какой мне интерес в циферке +1, я по вашим условиям выигрываю маленький плюсик, а вы 59$ потому как лицензия пойдет клиенту и соответственно минус в расходах и плюс в семейный бюджет для вас. Это ведь вы предлагаете спор, а не я, поэтому мне нет никакого интереса в нем участвовать, если нет никакого интереса в выигрыше. От того что вы напишите этот скрипт или нет, мне не холодно, не жарко, вообще ничего, мне сам скрипт и алгоритм интереса не представляет, потому что он мне не нужен, соответственно мне интересен только выигрыш и более ничего, и естесственно с минимальными возможными потерями, предоставление лицензии это минимальная для меня потеря, зато возможен хороший выигрыш, это хороший интерес для участия в споре, все остальное интереса как такового для моего участия в споре не представляет.

Ссылка на сообщение
Поделиться на других сайтах

ну ладно , тогда давайте =)

если все поняли условия , тогда скажите куда кидать инсталл. будет через 15-20 мин

Ссылка на сообщение
Поделиться на других сайтах

если все поняли условия , тогда скажите куда кидать инсталл. будет через 15-20 мин

куда хотите, пусть это будет подарком топик стартеру. Через 15 минут меня не будет, т.к. закончился рабочий день, посмотрю позже через несколько часов или завтра.

Ссылка на сообщение
Поделиться на других сайтах

ну тогда 2 мин

1.Хак предоставляет возможность прибавлять к просмотрам новости 1 просмотр с одного айпи раз в сутки.

2.Хак снижает общую нагрузку на бд - обновление бд происходит только тогда когда пользователь просматривает новость в первый раз или на следующие дни.

Установка

1) Через phpmyadmin делаем запрос

ALTER TABLE `*ПРЕФИКС*_post` ADD `ip_views` TEXT CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL ;
где *ПРЕФИКС* - ваш префикс таблиц бд. 2) Находим в engine/engine.php
if (! $newsid) $sql_news = "SELECT id, autor, date, short_story, full_story, xfields, title, category, descr, keywords, alt_name, comm_num, allow_comm, allow_rate, fixed, rating, vote_num, news_read, approve, votes, access, flag, editdate, editor, reason, view_edit, tags, metatitle FROM " . PREFIX . "_post WHERE alt_name ='$news_name' AND date >= '{$year}-{$month}-{$day}' AND date < '{$year}-{$month}-{$day}' + INTERVAL 24 HOUR LIMIT 0,1";

				else $sql_news = "SELECT id, autor, date, short_story, full_story, xfields, title, category, descr, keywords, alt_name, comm_num, allow_comm, allow_rate, fixed, rating, vote_num, news_read, approve, votes, access, flag, editdate, editor, reason, view_edit, tags, metatitle FROM " . PREFIX . "_post where  id = '$newsid'";
меняем на
if (! $newsid) $sql_news = "SELECT id, autor, date, short_story, full_story, xfields, title, category, descr, keywords, alt_name, comm_num, allow_comm, allow_rate, fixed, rating, vote_num, news_read, approve, votes, access, flag, editdate, editor, reason, view_edit, tags, metatitle, ip_views FROM " . PREFIX . "_post WHERE alt_name ='$news_name' AND date >= '{$year}-{$month}-{$day}' AND date < '{$year}-{$month}-{$day}' + INTERVAL 24 HOUR LIMIT 0,1";

				else $sql_news = "SELECT id, autor, date, short_story, full_story, xfields, title, category, descr, keywords, alt_name, comm_num, allow_comm, allow_rate, fixed, rating, vote_num, news_read, approve, votes, access, flag, editdate, editor, reason, view_edit, tags, metatitle, ip_views FROM " . PREFIX . "_post where  id = '$newsid'";
3) Находим в engine/modules/show.full.php
$db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+1 where id='{$row['id']}'" );
меняем на
{

					$_IP = $db->safesql( $_SERVER['REMOTE_ADDR'] );

					if($row['ip_views']!=""){

					$ips=explode(",", $row['ip_views']);

				if(time()>($ips[0]+86400)){

						$doupdate=1;

						$row['ip_views']=str_replace($ips[0],$row['ip_views']);

						$ips[0]=$ips[0]+86400;

										}else $doupdate=0;

					}

					else

					$ips[0]=time();

				if(!in_array($_IP,$ips) or $doupdate==1){

				if($doupdate==1)

				$row['ip_views']=$ips[0];

					if($row['ip_views']=="" and $doupdate!=1)

						$ip_views=time().",".$_IP;

					else

					{

						$ip_views=$row['ip_views'].",".$_IP;

						}


				$db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+1 , ip_views='$ip_views' where id='{$row['id']}'" );

			}


			}

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

keiZ,

И это без нагрузки? У вас что один посетитель в день? Да этот способ в тысячи раз тяжелее чем способ с отдельной БД и двумя запросами, при каждом просмотре новости новым посетителем в таблицу новостей!!!! которая является очень большой по размерам таблицей, вы производите запись текстового поля!!! которое может достигать многих мегабайтов!!! в зависимости от посещаемости. Запись в большую таблицу это очень ресурсоемкий процесс, на время которого блокируется таблица на чтение, и она становиться недоступной для всех, тем более более когда в нее будет писаться например огромный блок текста, это сделает весь сайт недоступным даже при маленькой помещаемости. А теперь представьте посещаемость сайта со 100 000 хостами в сутки, это между прочим не самая большая посещаемость, размеры данных для каждой новости будут 22 байта на каждого посетителя, умножаем на 100 000 размер текста станет 2 200 000 байт если все пользователи посмотрят за сутки новость, а они ее посмотрят, при этом на каждый просмотр новости новым пользователем вы будете записывать в поле больше 2МБ!!!!!! данных, и это на каждую!!!! новость, и это кстати при условии размер обычного текствого поля может быть всего 65KB Да даже самый мощный сервер умрет через минуту, запись будет происходит огромное количество секунд, если не минут, при этом вся таблица будет недоступна, и сайт будет недоступен никому. Плюс катастрофические объемы БД забитыми IP таблицу. Ваше решение производит 100 000 раз записей в БД размером в 2MB в сутки, т.е. 200 GB на одну!!!!! новость, трафика при посещаемости в 100 000 хостов в сутки

Это не решение без нагрузки, это решение убийца любого сервера.

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

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

Ссылка на сообщение
Поделиться на других сайтах

можно я громко посмеюсь, нет правда :)))))

спасибо за вариант без нагрузки)

Ссылка на сообщение
Поделиться на других сайтах

Это не решение без нагрузки, это решение убийца любого сервера.

1. юзер заходит на сайт

2. видит новости и заходит в одну из них , что происходит - к счётчику просмотров прибавляется единичка+1 апдейт бд (как есть сейчас)

3. юзер нажимает ф5 , что происходит - к счётчику ничего не прибавляется+0 апдейтов бд

4. через сутки юзер заходит в эту новость и происходит то что в пункте 1

ну это есть

и где же мы тут обсуждали нагрузку ?

либо вы имеете в виду сайт у которого 100000 просмотров у определённой новости в день

либо вы не делите свои 2МБ на количество новостей которое они просмотрят

если 1ое - покажите хотя бы 1 такой сайт на дле

если 2ое - то вы же понимаете что нагрузка будет снижена

и на сайтах с 5-10-20к и т.д хостами нагрузка будет снижена

в среднем количество кликов превышает количество хостов в 10 раз

при 10к хостах у вас будет 100к апдейтов бд , у меня 10к и это практически не повлияет на нагрузку.

не смешите меня

100к хостов

покажите мне хотябы такой сайт на дле , а не то чтобы 100к просмотров новости , 2.2мб , ну да , пхаха

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

и где же мы тут обсуждали нагрузку ?

Что за бред? Читайте свои сообщения, это вообще то суть вашего предложенного спора

http://forum.dle-news.ru/index.php?showtopic=52926&view=findpost&p=257287

http://forum.dle-news.ru/index.php?showtopic=52926&view=findpost&p=257308

а пункты это список условий которые должны выполнятся, а не суть спора.

либо вы имеете в виду сайт у которого 100000 просмотров у определённой новости в день

я имею 100 000 посетителей в день, и каждый посмотрим минимум одну новость и как мимимум первую, хотя с вашим решением не посмотрит, сервер ляжет, или по вашему каждый посетитель смотрит только одну новость, и то только те что не смотрели другие. А длина одного IP вместе с датой 22 байта, включайте дальше математику.

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

Ссылка на сообщение
Поделиться на других сайтах

нет уж , вы предоставьте новость у которой было 100к просмотрами в день

теперь представьте посещаемость сайта со 100 000 хостами в сутки, это между прочим не самая большая посещаемость, размеры данных для каждой новости будут 22 байта на каждого посетителя, умножаем на 100 000 размер текста станет 2 200 000 байт

показывайте

и опять же нет - я и не собирался сливать и не собераюсь , вы говорите 100к просмотров , 2.2мб , да пожалуйста , давайте. 59$ я успешно заработаю за пару дней.

и дайте ссылочку заодно на свой сайт с 100к хостами , глянем сколько у вас просмотров у новостей :lol:

ну и да - 59$ будут крутиться на Вашей совести потому что я тоже могу сказать что у сайта будет 1000000000 просмотров в день и сайт ляжет из-за вечного апдейта , любому будет ясно что сайты с 1к просмотром новостей будут всё без проблем считать , а у большинства сайтов меньшее количество просмотров - 22кб загрузить любому серву раз плюнуть.

жду 100к просмотров новости

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

keiZ,

Тратить время на ваш бред больше не вижу смысла. Что я вам должен показать? Для начала покажите ваше решение без нагрузки, про которое вы тут писали писали со своими хмыками и смайлами. 100 000 я написал для округления чтобы удобней было считать когда вам расписывал почему это решение бредовое, ваше решение не выдержит даже четверти нагрузки например этого сайта http://epidemz.net/index.php а у него не самая большая посещяемость, а размеры текстового поля в БД вообще 65КБ, что равно 2959 просмотрам новости, после чего ваш алгоритм умрет, он даже до 2MB не доживет.

, а у большинства сайтов меньшее количество просмотров - 22кб загрузить любому серву раз плюнуть.

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

Ссылка на сообщение
Поделиться на других сайтах

мда

читайте мой бред ещё раз

и на сайтах с 5-10-20к и т.д хостами нагрузка будет снижена

в среднем количество кликов превышает количество хостов в 10 раз

при 10к хостах у вас будет 100к апдейтов бд , у меня 10к и это практически не повлияет на нагрузку.

на варезниках с 5к хостами по +100просмотров к новости в день (и это много , обычно в пределах +10 , +30)

тоесть тут нагрузка не будет снижена ? 220байт загрузить 100 для каждого юзера ? по сравнению с например 25к апдейтами бд при кликами которые они сделают ? =( по крайней мере она не увеличится

и да , записывать им нужно будет целых 220байт , ай-я-яй. размер новости в 10 раз больше

такое чувство что вы пол жизни проработали в гугле в разделе по уменьшению нагрузки на высоконагрузочных серверах

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

keiZ,

К чему ваши сообщения непонятно? Вы грозились написать решение без нагрузки, пишите, где оно, я его не увидел, пока его нет, не нужно здесь разводить, воду по варезникам, сколько и кого кликов и т.д. Вы должны написать решение без нагрузки, даже более того решение которое даже по вашим смелым заявлениям должно было быть даже меньше чем стандартное решение. Где оно? Пока вы его не предоставите нет никакого смысла водить вилами по воде, про варезники, клики и прочее.

тоесть тут нагрузка не будет снижена ? 220байт загрузить 100 для каждого юзера ?

купите калькулятор, с математикой у вас плохо, длина IP плюс дата равно 22 байта, умножаем на 100 равно 2200 байтов, а не 220. и это 2КБ только на 100 просмотров, это даже не посещаемость, а размеры уже становятся катастрофическими чтобы их писать при обычном просмотре страницы

И это даже не все, ваш код вообще не рабочий, точнее перестанет работать ровно через сутки, т.к. дата одна на всех, и проверка по времени

if(time()>($ips[0]+86400)){ 

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

Или вы сейчас напишите все посетители заходят одновременно в 0:00 :)

Ссылка на сообщение
Поделиться на других сайтах

И это даже не все, ваш код вообще не рабочий, точнее

сколько букав , дальше попросту не читал

фейспалмище

if($doupdate==1)

                                $row['ip_views']=$ips[0];

                                        $ip_views=$row['ip_views'].",".$_IP;

                                                

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

keiZ, а str_replace что там делает с 2 параметрами?

И где учет каждого IP по времени?

Изменено пользователем Wanderers
Ссылка на сообщение
Поделиться на других сайтах

сколько букав , дальше попросту не читал

меня это и не удивляет, нагрузку на сервер ваш код не несет, про нагрузку даже и разговора в этой теме небыло, записывать текст это даже не нагрузка на сервер, 22 умножить 100 это 220, какой смысл вам что то доказывать? Вы еще напишите что в вашей строчке

$row['ip_views']=str_replace($ips[0], $row['ip_views']);

ошибок нет, читайте документацию по функции http://de3.php.net/manual/en/function.str-replace.php ей должно передаваться не менее трех параметров, а не два как у вас, она просто напросто скидывает warning в логи, о неверном количестве параметров и обнуляет $row['ip_views'] вы даже не проверяли то что написали здесь на форуме, поэтому какой смысл вам что то доказывать? Это бессмысленная трата времени.

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

keiZ, а str_replace что там делает с 2 параметрами?

И где учет каждого IP по времени?

Мы с вами одновременно написали :) И не спрашивайте, я уже спросил и получил ответ

сколько букав , дальше попросту не читал

фейспалмище

автор даже не понял почему нет учета каждого IP по времени, а может даже и не понял что нужен учет каждого IP времени и почему.

Ссылка на сообщение
Поделиться на других сайтах

$row['ip_views']=str_replace($ips[0], $row['ip_views']);

зачем на форум ставить ограничение по времени на редактирование сообщений ? боитесь что юзера отредактируют свои прошлогодние сообщения ? :D:D:D

удалить не успел , сносите , если бы вы вдумались в код то поняли что оно погоды не делает

22 умножить 100 это 220

ой прости меня за опечатку , нолик недоклацал

посещяемость

просто напросто

перепишеться

и т.д

а фо это такое ? и вправду мне говорили что все коддеры рано забивали на учёбу , видно слишком рано :lol:

лично я недоклацал - лично вы уверены что так правильно , в умного решили поиграть , да удачи - http://www.php.ru/forum/viewtopic.php?t=28402 по факту ответы "лоховская реализация" , "да норм будет" и "Занимать она запросто может больше места" , ну и завтра будет ещё больше подобных ответов.

больше вам и не положено читать

можете отвечать , стараться , писать и думать что вы правы. удачи.

тупые углы не тупятся (с)

автор даже не понял почему нет учета каждого IP по времени, а может даже и не понял что нужен учет каждого IP времени и почему.

time() в 00:00 и будет вам ровно раз в сутки , собрались мегакоддеры писать скрипты для пентагона

амбиции у меня..хх..я хотя бы их по поводу :D

и допивая стакан кефира я официально заявляю - вы были только что заовнены.

удачи

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

да удачи - http://www.php.ru/forum/viewtopic.php?t=28402

Рассмешило название форума: "Список форумов PHP.RU -> Вопросы от блондинок" :rolleyes:.

PS Без намеков. К слову, та ветка для меня вполне подходит )

Ссылка на сообщение
Поделиться на других сайтах

если бы вы вдумались в код то поняли что оно погоды не делает

А зачем писать код, который ничего не делает, кроме записи в лог, или вы думаете что запись сообщения в лог очень быстрая?

нолик недоклацал

Тут нолик, а там не поехало или не долетело...

Печально...

Ссылка на сообщение
Поделиться на других сайтах

Ух намутили... :D

Собственно, хотел просто добавить свои 5 копеек, просто имхо, кого-либо поддерживать из спорщиков не стану, поскольку оба в крайности вдаются, а вот получить общими усилиями улучшенный скрипт было бы здорово :)

if(!in_array($_IP,$ips) or $doupdate==1){
Сам так часто делаю для упрощенки, но лучше все-таки так:
if(!in_array($_IP,$ips)) {} else if($doupdate==1) {}

Зачем 2 условия одновременно создавать для такого "тяжелого" случая? - перебирать зря впустую массив из нескольких сотен или тысяч параметров?

Хочу уточнить. У меня, например, ип меняется каждые полчаса (в среднем), у кого-то может каждые несколько минут, поэтому нужно сначала проверять юзера, если Гость, то смотреть ип; ипы не всегда определяются - нужно это тоже учесть, кто скрытым прокси пользуется или еще какой гадостью...

22 байта ипа, как эта цифра получилась? (без иронии и усмешки, просто любопытно). Я так полагаю: формат xxx.xxx.xxx.xxx (IPv4), следовательно 15 символов из общей таблички символов (анг. алфавит + цифры + некоторые символы), все символы из таблички равны 1 байту, т.е. в общей сумме получим 15 байт, а не 22 или нужно как-то иначе считать? В данный момент мой ип 178.88.13.8, что составляет 11 байт, т.е. в 2 раза меньше (по моим подсчетам)! Но можно ведь сумму ипа записать, что получится еще меньше, насколько я помню (давненько считал, получалось 6 знаков, если не ошибаюсь).

Теперь нужно все последовательно сделать. Клепаем новую таблицу с полями: UserName, ip, time. Если юзер зарегистрирован, то его ид вносим для проверки, если нет, то UserName = 0, пишем ип; записываем время. Для каждого юзера проверяем счетчик, он должен быть менее суток.

Хотелось бы заметить. При посещаемости в среднем в 100к просмотр любых новостей, кроме первых будет примерно 10-20%, т.е. 10-20к и никак не больше. Если я захожу на сайт с тысячами новостей, то я их в принципе все не смогу физически за день посмотреть и еще, если я захожу с поисковика, то редко читаю более одной новости... Сначала смотрю категории, затем короткие новости и уж потом решаю, стоит ли мне читать новость полностью. Т.е. посещалка большая, но нагрузка откуда такая большая, тем более, что нагрузка только при просмотре полной новости и только полной новости, а не стат. страницы и т.д.?

Ну вот собственно и всё.

П.С. keiZ, ваше умение программировать не дает вам повода грубить и хамить форумчанам, тем более админам, будьте проще, люди к вам обязательно подтянутся, наверняка вы многое умеете и могли бы подсказать разные хорошие решения и не только этой проблемы, выкладывайте свой готовый код в соседней ветке, обсудим. ;)

Изменено пользователем zgr
Ссылка на сообщение
Поделиться на других сайтах

Рассмешило название форума: "Список форумов PHP.RU -> Вопросы от блондинок" .

название ветки для несерьёзных вопросов , в которых нужны простые ответы.

А зачем писать код, который ничего не делает, кроме записи в лог, или вы думаете что запись сообщения в лог очень быстрая?

ты хотя бы в жизни хоть 1 модуль написал ? хотябы на 100 строк ? написал я код , чтобы чтото не забыть , или сделать , уже не помню и не обратил внимание что он остался. после когда пересматривал его увидел и не успел удалить. целсофт же домой с работы убегал , отсчёт шёл на минуты :lol: (забавно что он потом 4 часа ещё сидел правда)

Тут нолик, а там не поехало или не долетело...

Печально...

ты наверное даже не в курсе откуда пошла фраза "это печально"

вот это и печально ;)

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

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

короче , лес там >>>>>>>

видно что люди учились по попову :lol:

гл

Изменено пользователем keiZ
Ссылка на сообщение
Поделиться на других сайтах

22 байта ипа, как эта цифра получилась? (без иронии и усмешки, просто любопытно). Я так полагаю: формат xxx.xxx.xxx.xxx (IPv4), следовательно 15 символов из общей таблички символов (анг. алфавит + цифры + некоторые символы), все символы из таблички равны 1 байту, т.е. в общей сумме получим 15 байт, а не 22 или нужно как-то иначе считать?

плюс дата когда заходил пользователь, плюс запятая которой отделяется дата, получается 22 байта. Формат же хранения предложенный в алгоритме, дата захода плюс IP, считать же нужно раз в сутки, и да конечно я брал по максимуму возможной длины IP, т.к. здесь нужно ориентироваться на сколько занимает размер одного параметра.

При посещаемости в среднем в 100к просмотр любых новостей, кроме первых будет примерно 10-20%, т.е. 10-20к и никак не больше. Если я захожу на сайт с тысячами новостей, то я их в принципе все не смогу физически за день посмотреть и еще, если я захожу с поисковика, то редко читаю более одной новости... Сначала смотрю категории, затем короткие новости и уж потом решаю, стоит ли мне читать новость полностью. Т.е. посещалка большая, но нагрузка откуда такая большая, тем более, что нагрузка только при просмотре полной новости и только полной новости, а не стат. страницы и т.д.?

в том то и дело что была посчитана только одна новость, трафик только от одной новости при 100 000 посетителях, составил 200GB. Безусловно это лишь теоретический расчет, в реалности она будет меньше, но в реальности и ограничение поля в БД всего 65KB, а размер теоретического расчета поля составил более 2MB. и поля в 2MB просто работать не будут, поэтому максимальная пропускная способность этого хака составила 2959 просмотров в сутки, потом размеры поля попросту кончатся.

Ну да ладно бог с ней с теорией перейдем к практике, просто проведем тесты кода:

Для начала тест стандартного счетчика

$time = new microTimer ( );
$time->start ();

for ($i=0; $i<3000; $i++) {

$db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+1 where id='3'" );

}

echo $time->stop ();
[/code] В данном коде мы в цикле эмулируем 3000 просмотров и смотрим время выполнения кода, оно составило: 0.47733 секунд т.е. тестовому серверу понадобилось всего полсекунды, для того чтобы выполнить 3000 запросов к БД для увеличения счетчика просмотра. Теперь проверяем алгоритм самого умного спорщика, для этого используем точно такой же цикл:
[code]$time = new microTimer ( );
$time->start ();

$ip_views =time().",111.111.111.111";

for ($i=0; $i<3000; $i++) {

$db->query( "UPDATE " . PREFIX . "_post set news_read=news_read+1 , short_story='$ip_views' where id='3'" );

$ip_views .= ",".time().",111.111.111.111";

}

т.е. тот же самый цикл размер списка IP увеличивается динамически по мере роста, каждого просмотра, запускаем. Время выполнения теста: 9.98681 секунды, нагрузка от счетчика увеличилась более чем в 20 раз!!! Это только чистая вставка в БД без механизмов проверки соответствия. А если добавить еще разбивку строки на массив и проверку массива, то время увеличивается в полтора раза и это уже 30!!! кратное увеличение нагрузки.

И это решение без нагрузки, браво, аплодирую стоя. И это только при трех тысячах просмотров, далее закончился лимит размеров поля в БД а если его увеличить то время работы будет расти в геометрической прогрессии, т.к. будет расти содержимое поля и цикл из 100 000 не выполнить даже выделенный четырех ядерный процессор, на котором проводились тесты. Хотя самый умный спорщик все равно это не поймет, потому что даже не знает что такое геометрическая прогрессия, математике его в школе не учили, а он почему то думал что без нее можно податься в программисты.

Все очень просто, никакого личного самолюбия и уверенности, тесты и факты, любой может проверить.

При этом даже если увеличить стандартный цикл в 10 раз, до 30000 то его время будет 2.58378 секудны, в пять раз меньше чем код автора топика даже без его увеличения. А увеличение цикла кода автора топика в 10 раз, т.е. до 30 000 уже приводит к падению тестового сервера, он попросту свалился по таймауту через несколько минут!!!, так и смог завершить тест.

ой мля , целсофт сказал что нагрузка будет шедевральная , я ему говорил что нет

Вот именно что только говорите, считая себя самым умным, а я в отличие от вас привожу лишь голые и проверенные факты, а вы свой код даже проверить на работоспособность не удосужились, не говоря уже о проверке нагрузки

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

time() в 00:00 и будет вам ровно раз в сутки , собрались мегакоддеры писать скрипты для пентагона

Браво, без комментариев, читайте то что вы написали собственно ручно технического задания:

1. юзер заходит на сайт

2. видит новости и заходит в одну из них , что происходит - к счётчику просмотров прибавляется единичка+1 апдейт бд (как есть сейчас)

3. юзер нажимает ф5 , что происходит - к счётчику ничего не прибавляется+0 апдейтов бд

4. через сутки юзер заходит в эту новость и происходит то что в пункте 1

даже выделил в четвертом пункте для слабовидящих и слабослышащих, и ничего не помнящих. Где учет даты у каждого посетителя его даты последнего посещения в вашем коде? Человек даже не понимает где сделал ошибку в собственном коде, о чем можно вообще тогда разговаривать. Или если человек зашел в новость в 23.59, а потом в 00:02 то для него пролетели сутки? И он зашел через сутки? Машину времени изобрели? он зашел через 3 секунды. А если перед ним зайдет в 00:01 другой пользователь, где в вашем коде будет запись счетчика на +1 у того кто был в 23.59 а потом зашел в 00:02. Время в вашем коде изменилось, а IP от пользователя который был 23.59 осталось.

Ссылка на сообщение
Поделиться на других сайтах

Так мне кто-нибудь скажет нормальный код для такого хака? Во даете тему что ли для споров делал? :blink:

Изменено пользователем injectMn
Ссылка на сообщение
Поделиться на других сайтах

Так мне кто-нибудь скажет нормальный код для такого хака? Во даете тему что ли для споров делал?

Да прошу прощения что вашу тему превратили во флуд.

Я бы порекомендовал вам обратиться на http://www.free-lance.ru/ там вы сможете быстро найти исполнителя на свой заказ. Так как такой возможности в скрипте нет, то вам нужно искать исполнителя на выполнение своего вопроса, там вы можете почитать отзывы других о работах исполнителя, прежде чем делать выбор на ком нибудь

Ссылка на сообщение
Поделиться на других сайтах

Целсофт, хотел поинтересоваться, а в будущем для простеньких сайтов может появиться в админке настройка "Учет счетчика по ипам"? Ведь средний сайт имеет посещалку 1000 - 10.000 человек, а никак не сотню тысяч или миллион, к тому же, как я заметил выше, если юзеров отделить от гостей (у меня в день до 50 раз может ип смениться - не писать же в БД этот мусор?), то ипов меньше писать... К тому же, если формат записи такой: "xxx.xxx.xxx.xxx,365 " (для упрощенки), то запись уменьшается до 20 символов/байт (это предел, в реале будет 10-14). Если вместо ипа записывать айди юзера (если залогинен), то еще меньше - 5-8 байт, примерно, а не 22, т.е. формат типа: "9999,365". Для простеньких сайтов это не сильно скажется на нагрузке: +/- 1-2 сек. на загрузку страницы на глаз незаметно, поэтому было б здорово галочку иметь на запас, так сказать. :)

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...