Показывай грамотно!

Никита "red_ion" Кислицин

Xakep, номер #054, стр. 054-090-1


(nikitoz@real.xakep.ru)

http://nikitos.inc.ru

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

Что там внутри?

Как я уже говорил, система будет представлять собой шесть скриптов, три из которых модульные - в них описываются все используемые функции, а оставшиеся юзают эти процедуры и осуществляют взаимодействие с пользователем. Некоторые функции по работе с клиентом мы уже описывали при создании site-engine, а в прошлом выпуске рассмотрели показ заданного баннера и обработку клика по нему. Напомню, наша система рассчитана на работу с большим количеством рекламодателей, каждый из которых может иметь по нескольку баннеров одного и того же формата. Как же определить, какой баннер показывать? Вообще, в нормальных системах выбор делается исходя из таргетинговых соображений: рекламу мониторов показывают людям, у которых низкое разрешение экрана, дорогие машины предлагают пользователям с хорошим дисплеем и проживающим в крупных городах, и т.д. и т.п. Но у нас безтаргетинговая система, поэтому в качестве определяющей величины будет выступать количество купленных для каждого баннера показов. Оно и логично: чем больше денег потратил перец, тем выше у него приоритет :). Еще раз опишем таблицу с баннерами:

mysql> create table banners(

-> bid int not null auto_increment primary key, #идентификатор баннера

-> type int, # идентификатор типа этого баннера

-> uid int, # идентификатор владельца баннера

-> link varchar 100, # линк, куда ведет баннер

-> src varchar 100, # путь, по которому находится картинка баннера

-> shows int); # количество показов

Функцию, определяющую, какой из баннеров надо показывать, зададим следующим образом: function show(tid : int):int. Вот как она работает. Составляется sql-запрос вида "select bid from banners order by shows limit 1". Он вернет указатель на один баннер, имеющий наибольшее число показов. Возвращаемый идентификатор баннера выводится при помощи уже описанной нами функции showbanner(pid). Понятно, что такой алгоритм выборки не является оптимальным. Ведь если кто-то купил кучу показов, то будет высвечиваться один и тот же баннер, а мелкие заказчики будут сосать лапу. Это не есть гуд. Поэтому в более сложных и продуманных системах используются хитрые вытесняющие приоритетные алгоритмы выборки. Например, добавляется еще одно поле "priorithet", содержимое которого в начальный момент зависит от числа купленных показов. После показа баннера с самым высоким приоритетом, эта величина снижается, у остальных наоборот повышается. Таким образом, через некоторое время, даже если у баннера будет еще очень много показов, его приоритет понизится, и в итоге высветится другой баннер. Так сказать, он "всплывет", а потом "утонет". И так будет повторяться. Но мне сейчас меньше всего хотелось бы останавливаться на этих алгоритмах. Ты их и сам сможешь без труда составить, посидев с листочком бумаги и карандашом :).

Содержание  Вперед на стр. 054-090-2