Autor Zpráva
JardaB
Profil
Zdravím,

nasadil jsem následující reklamní jednotku na nejmenovaném portále, který využívá APC akcelerátor:

<a href="http://domena.tld/" title="Titulek"><img src="http://domena.tld/script.php?id=2&path=500x200" width="500" height="200" border="0" alt="popis"></a>

Provedený scriptík nabídne banner a počítá počty zobrazení. Bohužel tyto počty jsou poměrně nízké oproti uvedeným hodnotám cca 400 tis. Já dostávám s bídou 10 tis za den. Je možné, že to může mít na svědomí právě APC akcelerátor, který je nasazen na webu, kde mi reklama běží? Jde případně možné tohle nějak obejít?

Moderátor Davex: Titulek „APC akcelerátor“ nevystihoval podstatu dotazu. Příště zkus prosím vymyslet lepší.
Jan Tvrdík
Profil
JardaB:
To spíš bude zkreslené cachováním obrázku v prohlížeči, ne?
JardaB
Profil
Nevylučuji ani tohle, tedy pokud by to tak bylo, skriptík není vůbec vykonán?

Web by měl mít 15 tis UIP za den, tedy kdyby to bylo cachováním prohlížeče, tak dostanu teoreticky min. právě těch 15 tis., ale já dostal tak polovinu. Otázka je také, zda opravdu taková návštěvnost webu je?

Dala by se tam vložit hlavička header(); která by to cachování snížila nebo úplně eliminovala?

část kódu pro zobrazení banneru je následující:

 header("Content-Type: image/gif");
   $image = imagecreatefromgif($imagepath); 
   imageGIF($image); 
   imagedestroy($image);
Davex
Profil
JardaB:
Nevylučuji ani tohle, tedy pokud by to tak bylo, skriptík není vůbec vykonán?
Ano, když už prohlížeč obrázek má, tak ho při návštěvě další stránky znovu nestahuje a skript vytvářející obrázek se tedy nespustí.

Dala by se tam vložit hlavička header(); která by to cachování snížila nebo úplně eliminovala?
To je trochu hloupé. Nové stahování obrázku by zbytečně zpomalovalo načítání stránky a uživateli spotřebovávalo datové přenosy (jsou i tací, kteří mají na mobilním připojení datový limit). To je často i důvod, proč lidé reklamy blokují. Bannery bývají obtěžující a uživatelům zvyšují náklady na datové připojení.

Mělo by se to udělat chytře, nejspíš pomocí hlavičky Cache-Control: max-age=0, private, must-revalidate a zároveň ve skriptu posílající obrázek implementovat podmíněné odeslání podle hlaviček If-Modified-Since a If-None-Match. Asi nějak podobně jako v tématu co je to eTag.

Tak, a teď je ještě potřeba změnit nadpis tohoto vlákna, protože už jsem mimo původní téma.
JardaB
Profil
Pokud jsem to dobře pochopil, mělo by to zajistit to, že obrázek zůstane v cache, ale script bude vykonán? Čímž tedy odpadne zátěž na opakované stahování vygenerovaného obrázku?
Davex
Profil
Ano, přesně tak. Prohlížeč si obrázek nechá v cache, ale před zobrazením se pokaždé serveru zeptá, zda se náhodou od posledně nezměnil. Skript by ho měl ho odeslat pouze pokud nevyhoví porovnání hodnot If-Modified-Since a If-None-Match v hlavičce. Pokud se nic nezměnilo, tak odešle stavový kód 304. Přístup se tak může započítat v obou případech.
JardaB
Profil
Moment, ale z toho co nyní píšeš se bude zjišťovat zda se obrázek nezměnil. Obrázek ale zůstává stále stejný po celou dobu, nemění se. Netrápí mne, že obrázek visí v cache, ten měnit po celou dobu kampaně nechci, ale trápí mne, že se nevykoná script, který má počítat počty jeho zobrazení.
Davex
Profil
Podoba obrázku nemá vliv na počítání zobrazení. Tady jde o to zajistit, aby se obrázek stahoval celý pouze při prvním zobrazení a každé další zobrazení se pouze započítalo.

Hlavička Cache-Control: max-age=0, private, must-revalidate posílaná skriptem spolu s hlavičkami ETag + Last-Modified a s obrázkem by měla zajistit, aby prohlížeč požádal server o obrázek při každém dalším zobrazení. Tento požadavek by měl být podmíněný v hlavičce hodnotami If-Modified-Since a If-None-Match na které by měl umět skript zareagovat a poslat obrázek pouze pokud se změnil. Pokud se nezměnil, tak pouze započítá návštěvu a odešle stavový kód 304 Not Modified bez obrázku. Prohlížeč pak zobrazí původní obrázek z cache.
JardaB
Profil
Díky za objasnění...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: