Sokan nem gondolnak ilyesmire, pedig elég fontos dolog.
A webszerver, esetünkben Apache2 dinamikus oldalgenerálásokra van optimalizálva, ezért fontos, hogy minél kevesebbszer kelljen neki újra és újra generálnia egy-egy képet.
Sok oldalon (nagyobbakon) megfigyelhető, hogy például a statikus elemeket külön webszerver, akár külön szerver szolgálja ki az oldal alatt.
Ennek oka szintén az, hogy a „Fő webszerver” ami a dinamikus tartalmat szolgálja, erre lett optimalizálva, míg általában a statikus részeket kiszolgáló webszerver le van butítva, így nem is lenne képek akár PHP-t futtatni.
Míg esetünkben adott egy akár általunk átméretezett kép, akár egy általunk generált kép (PHP GD, PHP Imagemagick stb...), amely rosszabb esetben minden meghíváskor újra és újra generálja a képet, ezzel a webkiszolgálót nyúzva.
Minden kép generálás ugyanis erős lemez, memória és processzor használatot igényel, legyen az egy egyszerű átméretezés (nagy képről kicsire stb... ) vagy egy bonyolultabb kép effekt, bármi. Ez nem jó senkinek sem.
Ezért jön a kérdés... Miért nem használjuk ki, hogy az oldalt látogatónk böngészője már egyszer lementette a képet a gyorsítótárába... ?
Az elv:
Kedves látogatónk, először jár az oldalon és mondjuk a galériánkat óhajtja megtekinteni, amely 3MB-os képeinket tartalmazza. De mi nem akarjuk elsőre a 2000x3000 pixeles képeinket betölttetni vele, így azt átméretezzük 200x300px-re. Egy oldalon mondjuk 50 kép, és mindezt átméretezni egyszerre?
Kész örökké valósággá válhat. Ekkor jön a böngésző, ami elsőre menti ezeket a már átméretezett képeket. De látogató barátunk még egyszer meg akarja nézni, frissíti az oldalt. Megint várhat sok ideig.
Szóljunk a böngészőnek, hogy „hé haver, ez a kép nálad egyszer már le van mentve!”.
A böngésző mindig küldi, hogy ő mikor látta utoljára azokat a média elemeket.
$_SERVER['HTTP_IF_MODIFIED_SINCE']
Gyakorlat:
$file = 'kep.jpg';
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) > filemtime($file))) {
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $lm).' GMT',true, 304);
exit;
}
Tehát, ha a böngésző értesít minket, hogy neki ez megvan, akkor értesítsük arról, hogy változott-e azóta.
De honnan jön a kep.jpg, ha generált a kép?
Onnan, hogy érdemes megcsinálni még azt, hogy amikor méretezzük a képet a látogatónknak, mi azt sunyiban le is mentjük átméretezve. És legközelebb megkívánja valaki azt nézni kis méretben, akkor már az jelenik meg, mert létezik, plusz hogy a kis képet se kelljen folyton oldalhívásonként beolvasni, megnézzük és elküldjük a böngészőnek, h mikor változott utoljára.
Íme egy élő példa. Ezzel egy URL-en megadott óriás képet méretez át, ment egy thumb mappába, majd legközelebb már a böngészőnek szól, hogy mikor változott utoljára.