Banner nach Priorität anzeigen

tomy69

Grünschnabel
Hallo,
ich programmiere gerade einen Bannermanager für meine Websites. Nun möchte ich die Banner nach Priorität anzeigen. Z.B. habe ich 3 Banner. Die Anzeigenhäufigkeit soll z.B. folgendermaßen aussehen:
1. Banner 50 %
2. Banner 30 %
3. Banner 20 %

Das heißt also, der erste Banner soll so häufig erscheinen, wie die anderen beiden zusammen.

Oder anderes Beispiel: Alle Banner sollen gleichmässig angezeigt werden.

Das ganze könnte man jetzt natürlich durch Zählung der Impressions pro Banner lösen. Dann kann man einfach berechnen, welcher Banner als nächstes angezeigt werden muss. Dies setzt aber für jeden Banneraufruf eine Abfrage in der Datenbank voraus, um festzustellen, wie oft die Banner bereits angezeigt wurden Das möchte ich aber vermeiden. Daher habe ich nach anderen Lösungen gesucht. Gefunden habe ich folgendes:
1. Die Bannerverwaltung OpenX (OpenAds) hat ein Proritätssystem, was ohne Datenbankzugriff auskommt. Leider verstehe ich nicht, wie das funktioniert.

2. Bei ASP gibt es die AdRotator Komponente (Siehe unter http://www.aspheute.com/artikel/20000711.htm ) Hier gibt man eine Impressionszahl an, woraus dann die Anzeigenhäufigkeit berechnet wird:
Impressions
Eine Zahl, die die relative Häufigkeit der Werbung angibt. Die einzelnen Häufigkeiten werden zusammengezählt und eine Anzeigedauer je nach der angegebenen Häufigkeit der einzelnen Werbungen ermittelt.

Weiß jemand wie das funktioniert oder hat jemand eine andere Idee, wie man Banner ohne Datenbankzugriff nach Priorität rotieren lassen kann?
 
Moin Tomy,

mal angenommen du erstelltest einen Array mit 100 Elementen, 50x Banner1, 30xBanner2,20xBanner3 ....

Dann könntest du daraus zufällig ein Element wählen, und das gewünschte Verhältnis bliebe gewahrt.


Ich hoffe, das hilft ein wenig als Gedankenanstoss :)
 
Hallo Sven,
danke für die Antwort. An so etwas habe ich auch schon gedacht. Aber ich meine, dass das zu aufwändig ist. Ich möchte eine Lösung, die auch bei Millionen Banneraufrufen im Monat effizient ist, damit der Server nicht zu stark belastet wird.

In der OpenX Anleitung (unter http://openads.ganzkurz.de/adminguide/hdk_engine.php) habe ich noch folgende Information gefunden:
Jetzt haben wir die verlinkten Banner, inklusive der Priorität jedes Banners. Als erstes wird jetzt festgelegt welcher Banner gezeigt wird. Dazu werden die Prioritäten der Banner zusammengezählt und eine Zufallszahl, mit der Summe als Maximum, gebildet.

Da verstehe ich nicht, wie ich jetzt mit der Zufallszahl, die ja aus den Prioritäten gebildet werden, den Banner bestimmen kann.
 
Hallo Sven,
danke für die Antwort. An so etwas habe ich auch schon gedacht. Aber ich meine, dass das zu aufwändig ist. Ich möchte eine Lösung, die auch bei Millionen Banneraufrufen im Monat effizient ist, damit der Server nicht zu stark belastet wird.

Mein Vorschlag sollte den Server bei 1Mio Aufrufen nicht mehr beanspruchen als bei 100.

Hier mal ein Beispiel:
Code:
<pre><?php
$banners=array_merge(
            array_fill(0,50,'banner1'),
            array_fill(0,30,'banner2'),
            array_fill(0,20,'banner3')
          );
          
//Kleiner Test ob das Verhältnis erhalten bleibt
$test=array();
for($i=0;$i<1000000;++$i)
  {
    $banner = $banners[array_rand($banners)];
    if(!isset($test[$banner]))$test[$banner]=0;
    $test[$banner]++;
  }
ksort($test);
print_r($test);
?></pre>

Mein XAMPP braucht 4 Sekunden für 1Mio Banner, und ich habe nicht unbedingt die neueste Hardware :)
Ohne den Test wäre es ein schlichter Zweizeiler :)
 
Ich werde das evtl.mal probieren, wenn mir nichts anderes einfällt. Der Test ist zwar nicht ganz realistisch, weil das Skript bei jedem Banneraufruf die Arrays erstellen muss und das Skript auch vielleicht 100 mal oder mehr zeitgleich aufgerufen wird. Aber vielleicht macht das trotzdem nicht viel aus.

Oder hat vielleicht einer noch eine andere Lösung? Evtl. kann jemand auch erklären, wie das bei OpenX funktioniert.
 
Nach deinem Zitat aus OpenX, wird das dort ähnlich dem gemacht wie es Sven Mintel dir vorgeschlagen hat - vielleicht sogar genau so.

Wenn dich die 2 Millisekunden zum Erstellen vom Array allerdings stören dann verwende einmal rand() und ganz viele if hintereinander:
PHP:
$iRnd = rand(0,10);
if ($iRnd >= 8) echo "20% Werbung";
elseif ($iRnd >= 5) echo "30% Werbung";
else echo "50% Werbung";

Aber ganz ehrlich? Das is ja toll prozedural nun aber so gut wie garnicht mehr dynamisch ... und ich hab'n sch... deutsch heute drauf.
 
Zurück