Есть сайт, на нем есть несколько рекламных мест. На каждом из рекламных мест крутятся баннеры (не более N штук на место).
Нужно показывать посетителям баннеры таким образом, чтобы количества показов каждого баннера были более-менее равными. Изначально у меня был скриптик такого плана:
<?php
$n=5;
$rnd_value=mt_rand(1,$n);
if ($rnd_value==1) {
// Показываем баннер номер 1
};
if ($rnd_value==2) {
// Показываем баннер номер 2
};
....
if ($rnd_value==5) {
// Показываем баннер номер 5
};
?>
Такой способ (случайный выбор номера баннера из заданного диапазона) неплох, но имеет недостатки в эффективности. А именно - например, одному посетителю может показаться баннер №1 - 3 раза, а другому посетителю баннер №2 тоже 3 раза, третьему посетителю баннер №3 так же 3 раза. Вроде бы баннеры показывались одинаковое количество раз, но распределение показов по посетителям жутко неравномерное.
Это навело меня на мысль о том, что лучше показывать баннеры в ротации не случайным образом, а по принципу "крутящегося барабана", т.е. последовательность баннеров будет жестко заданной и для каждого посетителя она будет одинаковой. Например посетитель ходит по ссылкам внутри сайта и баннеры меняются таким образом: 1 --> 2 --> ... --> N, затем опять показывается 1-ый, 2-ой и т.д..
Аналогия такого способа - это рекламные щиты (билборды) на улицах, изображение на которых крутится на вертикальных трёхгранных осях (т.е. на одном месте в ротации находится 3 изображения). Нечто подобное я хотел получить у себя на сайте....
И написал я следующий код:
<?php
$rot_min=1;
$rot_max=5;
if (!(isset($_SESSION['rotator']))) {
// Если нет в сессии еще переменной ротации (первый заход), тогда ее создаем.
$_SESSION['rotator']=$rot_min;
$rnd_value=$_SESSION['rotator'];
} else {
// Если уже есть переменная ротации
$rnd_value=$_SESSION['rotator'];
};
// Показываем баннер
if ($rnd_value==1) {
// Показываем баннер номер 1
};
if ($rnd_value==2) {
// Показываем баннер номер 2
};
....
if ($rnd_value==5) {
// Показываем баннер номер 5
};
// Делаем +1 шаг по "барабану"
$_SESSION['rotator']=$_SESSION['rotator']+1;
// Если перескочили за максимум, тогда возвращаем к минимуму
if ($_SESSION['rotator']>$rot_max) {
$_SESSION['rotator']=$rot_min;
};
?>
И вроде как всё должно быть замечательно :) При обновлении страницы по F5 так и происходит - баннеры сменяют друг друга в чёткой последовательности, друг за другом.
Но если начать переходить со страницы на страницу - тогда получаются прыжки через одного в последовательности баннеров... Отчего получается так, что в этом случае баннеры показываются не с шагом 1? :unsure:
Пример:
Показ баннера №1
Показ баннера №3
Показ баннера №5
Показ баннера №2
Показ баннера №4
:blink:
Есть у кого какие-нибудь соображения по этому поводу? Почему есть разница при обновлении одной и той же страницы и при переходе с одной страницы на друную?
P.S.: код вставки ротатора баннеров одинаков.
Спустя 4 часа, 4 минуты, 23 секунды (27.05.2011 - 22:50) Snus написал(а):
Используй куки, записывай id последнего показанного баннера и прибавляй единицу.
setcookie('val', $id);
$_COOKIE['val'];
Спустя 52 минуты, 38 секунд (27.05.2011 - 23:43) Turboworld1 написал(а):
Благодарю за совет! Попробую...
Но мне интересно еще - почему сессии пробуксовывают?
Но мне интересно еще - почему сессии пробуксовывают?
Спустя 2 дня, 13 часов, 30 минут, 4 секунды (30.05.2011 - 13:13) Turboworld1 написал(а):
C куками всё получилось.
Только пришлось перенести скрипт чтения/записи куков отдельным файлом и вставить его ДО команд вывода.
Может и со сессиями поэтому проблема была, что надо было код поднять ДО операций вывода (echo и прочие), т.е. до отправки HTTP-заголовков?
Только пришлось перенести скрипт чтения/записи куков отдельным файлом и вставить его ДО команд вывода.
Может и со сессиями поэтому проблема была, что надо было код поднять ДО операций вывода (echo и прочие), т.е. до отправки HTTP-заголовков?
Спустя 2 минуты, 19 секунд (30.05.2011 - 13:15) neadekvat написал(а):
Turboworld1, кукисы - это тоже часть заголовка (а не заголовков), поэтому их надо ставить до любого вывода информации на экран, да.
Спустя 21 минута, 36 секунд (30.05.2011 - 13:37) Turboworld1 написал(а):
А сессии? Как-нибудь завязаны на http-заголовок?
Спустя 6 часов, 24 минуты, 2 секунды (30.05.2011 - 20:01) Turboworld1 написал(а):
Почему не работало со сессиями, я не знаю. Сессии никак не завязаны с http-заголовком и командами вывода?
В общем, сделал я на кукисах. Код см. ниже. Так всё работает.
Этот кусок кода должен быть вставлен ДО команд вывода:
А это уже код вывода самих баннеров:
В общем, сделал я на кукисах. Код см. ниже. Так всё работает.
Этот кусок кода должен быть вставлен ДО команд вывода:
// ++++++++++++++++++++++++++++++++++++++++++++++++
// Вычисляем переменную $banner2 (номер для показа баннера формата 240x400)
$banner2_min=1;
$banner2_max=5;
if (isset($_COOKIE['bnr2'])) {
// Если уже есть переменная ротации, тогда считываем ее - получаем НАСТОЯЩЕЕ значение
$banner2=$_COOKIE['bnr2'];
} else {
// Если нет в куках еще нет переменной ротации (первый заход), тогда ее ставим.
$banner2=mt_rand($banner2_min,$banner2_max);
setcookie('bnr2', $banner2, time()+60*60*24*30); // на 30 дней
};
// Записываем в куки СЛЕДУЮЩЕЕ значение для переменной
if ($banner2+1<=$banner2_max) {
setcookie('bnr2', $banner2+1);
} else {
// Если перескочили за максимум, тогда возвращаемся на минимум
setcookie('bnr2', $banner2_min);
};
// ++++++++++++++++++++++++++++++++++++++++++++++++
А это уже код вывода самих баннеров:
if ($banner2==1) {
// Выводим баннер 1
};
if ($banner2==2) {
// Выводим баннер 2
};
if ($banner2==3) {
// Выводим баннер 3
};
if ($banner2==4) {
// Выводим баннер 4
};
if ($banner2==5) {
// Выводим баннер 5
};
Спустя 6 часов, 56 минут, 31 секунда (31.05.2011 - 02:57) kirik написал(а):
Цитата (Turboworld1 @ 30.05.2011 - 13:01) |
Сессии никак не завязаны с http-заголовком и командами вывода? |
Завязаны. При установке сессии клиенту отправляется заголовок, устанавливающий сессионную куку, а потом клиент эту куку отправляет серверу при каждом последующем обращении.
А вы стартовали сессию (session_start()) перед тем как использовать сессионные переменные? Если что функция session_start() тоже должна вызываться до любого другого вывода (если только не используется буферизация выводимого контента).
Спустя 21 день, 14 часов, 1 минута, 21 секунда (22.06.2011 - 16:59) Turboworld1 написал(а):
В общем, прикол
Заметил и с куками такую же фигню (сабж). В ротации было 2 баннера на 1 место. При этом когда переходил по пунктам меню - получалось что видел всегда 1 баннер, при нажатии просто F5 баннеры менялись нормально.
Причина сего действа оказалась нетривиальной. Пункты меню у меня - это <div></div> с событием onclick. А внутри дива уже ссылка <a>. Дык вот если кликать на ссылку - то отрабатывали ДВА запроса GET - сначала переход по ссылке, а через несколько миллисекунд уже onclick. Получалось что кука считывалась и ставилась дважды. И получалось, что я видел всегда один баннер (двойной проворот "барабана" из двух сторон). Если баннеров больше - то происходил переход по сторонам барабана с шагом 2 ("двойной" шаг). В итоге, если баннеров четное число - половина баннеров не показывалась при переходах по ссылкам меню (т.к. при таком раскладе - с шагом 2 - показывались либо только четные, либо только нечетные).
Обнаружил я это, услышав "двойной" звук клика по ссылкам меню в браузере (у меня Avant Browser).
Так что вот такая загогулина Вероятно и со сессиями такое же было точно.
Заметил и с куками такую же фигню (сабж). В ротации было 2 баннера на 1 место. При этом когда переходил по пунктам меню - получалось что видел всегда 1 баннер, при нажатии просто F5 баннеры менялись нормально.
Причина сего действа оказалась нетривиальной. Пункты меню у меня - это <div></div> с событием onclick. А внутри дива уже ссылка <a>. Дык вот если кликать на ссылку - то отрабатывали ДВА запроса GET - сначала переход по ссылке, а через несколько миллисекунд уже onclick. Получалось что кука считывалась и ставилась дважды. И получалось, что я видел всегда один баннер (двойной проворот "барабана" из двух сторон). Если баннеров больше - то происходил переход по сторонам барабана с шагом 2 ("двойной" шаг). В итоге, если баннеров четное число - половина баннеров не показывалась при переходах по ссылкам меню (т.к. при таком раскладе - с шагом 2 - показывались либо только четные, либо только нечетные).
Обнаружил я это, услышав "двойной" звук клика по ссылкам меню в браузере (у меня Avant Browser).
Так что вот такая загогулина Вероятно и со сессиями такое же было точно.