php очередь баннеров fifo

Я только начинаю размещать рекламу на своем веб-сайте, и я хотел бы иметь возможность дать 1000 просмотров ad_a , 2000 просмотров ad_b и, скажем, 10000 просмотров ad_c.

Если бы в то время просматривалась только одна страница, было бы легко обновить базу данных и определить, сколько осталось просмотреть для каждого объявления, но доступ к нескольким страницам может быть одновременным, и это усложняет ситуацию.

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

Большое спасибо за вашу помощь!


person user420329    schedule 08.09.2011    source источник
comment
Очередь действительно будет работать нормально. Когда он опустеет, заполните его баннерами для показа в соответствии с правилами.   -  person Stefan H Singer    schedule 08.09.2011


Ответы (3)


Вы можете использовать Memcached для хранения текущего количества просмотров. Memcached быстрый и легкий, у вас не будет проблем с производительностью. Кроме того, что-то более сложное было бы иметь «очередь», как вы говорите, и некоторые параллельные процессы обновляют ее, добавляя туда, какой баннер показывать, чтобы вы могли их перепутать.

person santiagobasulto    schedule 08.09.2011
comment
Я искал что-то подобное, звучит очень хорошо, я прочитаю документ и посмотрю, как это происходит. - person user420329; 08.09.2011

Тот факт, что одну и ту же страницу можно просмотреть много раз одновременно, не должен быть проблемой, поэтому БЛОКИРОВКА ТАБЛИЦ предназначена для.

LOCK TABLES ads WRITE;
SELECT ad_id FROM ads WHERE ad_views_remaining > 0 LIMIT 1;
UPDATE ads SET ad_views_remaining = ad_views_remaining -1 WHERE ad_name = THAT_AD_ID_YOU_SELECTED_BEFORE;
UNLOCK TABLES;

Таким образом, никто не сможет прочитать таблицу, пока она не будет обновлена. (это пример для MySQL, я уверен, что большинство других СУБД также поддерживают блокировки)

person cypher    schedule 08.09.2011
comment
Memcached кажется хорошим вариантом, но я совершенно забыл о блокировках таблиц, это было бы намного проще реализовать! Я тоже пойду! Спасибо, ребята, за вашу помощь! - person user420329; 08.09.2011
comment
Чувак, ты можешь просто использовать транзакции. Но тогда у вас будет узкое место. - person santiagobasulto; 08.09.2011
comment
Не всегда, например, если вы работаете на MyISAM, вы облажались. - person cypher; 08.09.2011

А как же ранд?

$r = rand(1, 13);
if ( $r == 1 )
    echo 'ad_a';
if ( $r > 1 and $r < 4 )
    echo 'ad_b';
if ( $r > 3 )
    echo 'ad_c';
person Herbicid    schedule 18.09.2013