Pomalé načítání obrázků – velky overhead

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
vankoma2
Člen | 2
+
0
-

Zdravim panove. Mam web, ktery musi na strance zobrazit 100 obrazku (v souctu cca jen 5MB). Obrazky jsou umisteny mimo web-root.

V sablone prezenteru mam cyklus, ktery mi z modelu ziska seznam obrazku. Za pomoci foreach tedy vytvori prislusne IMG tagy. Ty maji v atributu src zadany link na signal fetchImage!. Tento pak obsahuje jednoduchou autorizaci pristupu, tedy kontrolu jestli se obrazek muze danym uzivatelem nacist. Pak dany obrazek nacte z disku a pomoci Nette\Image->send() jej odesle na vystup.

Fragment kodu sablony:

<?php
{foreach $images as $image} // $image je cesta k souboru
    <img src="{link fetchImage!, $image}" />
{/foreach}
?>

Fragment kodu signalu fetchImage:

<?php
public function handleFetchImage($file) {
    if ($this->isFileOk($file)) {
        $image = Nette\Image::fromFile($file);
        $image->send();
    }
}
?>

Stranka samotna(bez obrazku) se po nakesovani vykresli velice rychle. Problem nastane kdyz se pak kazdy IMG element zacne dotazovat pro svuj obrazek do Nette aplikace. Tim vznikne 100 pozadavku na server, pricemz zakazdym se opetovne spousti cele Nette az kym to neprobubla do urceneho signalu, ktery tento, prakticky maly, pozadavek konecne obslouzi. Overhead je pak mastodontsky a stranka se nacita neprijatelne dlouho. Navyse kdyz uvazim ze zpracovani na serveru je prakticky nulove a samotna velikost vsech prenesenych dat je cca 5MB. Stranka samotna (i s obrazky) se prakticky v case nemeni. Problemem je tedy mnozstvi vygenerovanych requestu spolu s opakovanym nacitanim celeho Nette v kazdem z nich.

Nevite mi prosim nekdo poradit jak toto vyresit? Nebo jaky je lepsi zpusob pro ziskavani obrazku ulozenych mimo web-root? Dekuji.

Editoval vankoma2 (6. 9. 2011 8:19)

Mikulas Dite
Člen | 756
+
0
-
  1. Zpracované obrázky bych cachoval a rovnou uložil – CDN asi k dispozici není, takže stačí třeba www/images/cache nebo cokoliv – tím se sníží požadavky každého requestu (zapojí se pouze apache)
  2. Jestli ty obrázky nejsou vidět hned všechny, ale je to třeba na styl galerie, zkusil bych něco jako http://www.appelsiini.net/…cts/lazyload (lazy image download) – sníží okamžitý počet požadavků v čase

Editoval Mikulas Dite (2. 9. 2011 17:21)