webrebel html css javascript laravel oop php mysql wordpress kurz

Problém s cache pri uploade obrázkov

napísal , 25 Sep 2010 [ PHP ]

Ak vaša stránka podporuje (vlastnú implementáciu) ikoniek/avatarov je možné, že ste sa stretli s týmto - po uploade nového obrázku sa stále zobrazuje obrázok starý. Ak sa nový zobrazí po refreshi, samotný upload funguje. Obrázok sa však musí zobraziť hneď, nemôžte od ľudí očakávať zbytočný refresh, navyše je to confusing.

Problém je, že obrázku zrejme zostal rovnaký názov súboru, na čo si prehliadač povie "Heeej, toto som už raz sťahoval! To aby som to radšej vytiahol z cache! Mwahahahaa..", podhodí starú verziu a cíti sa múdro.

Jednoduchý spôsob ako ho oklamať je pridať na koniec názvu náhodne vygenerovaný reťazec znakov. Napr.:

<?php 
  $randstr = base_convert(crc32(mt_rand()), 10, 36);
  $nazov = "$subor-$randstr.jpg";
?>

Riešení je kopa, dobré je začať s náhodným číslom (alebo použiť uniqid(), čo vygeneruje reťazec na základe aktuálneho času v mikrosekundách), prehnať to cez nejakú tú hashovaciu funkciu (md5(), sha1()) a na koniec z toho vystrihnúť zopár znakov.

Takže - pridajte niekoľko náhodných znakov do názvu súboru a prinútite browser vyhnúť sa cache pamäti. *lusk*

napísal , 25 Sep 2010

5 komentárov

komentuj
  1. 81403 [ Sobota 25.9.2010, 18:45 ]

    Ja by som ešte doplnil, že ak potrebujete vynútiť reload v situáciách, keď načítavate súbor, ktorého meno sa nemení/nemôže meniť (napríklad najnovšie jQuery z CDNka), stačí použiť takéto jednoduché a elegantné riešenie:
    <script src="http://code.jquery.com/jquery-latest.min.js?2010-24-09_18-40"></script>
    Časť URL za otáznikom sa na serveri viac menej odignoruje a browser bude osprostený a stiahne to ako úplne nový súbor :)

  2. Andrej Herich [ Nedeľa 26.9.2010, 14:16 ]

    Ak nemáme v úmysle obrázky nejako skrývať, načo je dobrá náhodnosť? Nie je krajšie vziať si nejakú (nie nutne vlastnú) podmnožinu všetkých reťazcov, usporiadať lineárne s najmenším prvkom, a prideľovať prvému nahranému súboru prvý reťazec, druhému druhý atp.? Teda by vznikali napr. súbory: subor-1.jpg,
    subor-2.jpg, subor-3.jpg, ...

  3. yablko [ Nedeľa 26.9.2010, 19:47 ]

    andrej andrej, zložitejšie to už nešlo napísať? :)
    samozrejme aj to je možné, ale to by sme si potom nemohli predstaviť všetky tie pekné funkcie, ktoré sa zídu, keď skutočne bude nutné generovať niečo náhodné ;)

  4. 81403 [ Nedeľa 26.9.2010, 22:00 ]

    Podľa mňa to zaberie viac kódu, keď chceš zvyšovať číslo na konci súboru (prove me wrong:), ale inak máš pravdu, že je to o niečo málo správnejšie ako generovanie náhodných čísel, keďže pri nich je šanca okolo dvoch desaťmiliardtín™, že sa vygeneruje to isté :)

  5. Andrej Herich [ Nedeľa 26.9.2010, 22:56 ]

    Ja sa nabudúce pokúsim zložitejšie.

    V PHP to asi zaberie viac kódu, keďže veci ako sha1, crc32 a pod. sú tam už štandardne, ale to predsa nie je relevatné. A áno rýpem v blbostiach, píšte ďalej články. Prosím si niečo o PHP Data Objects, ak s tým máte skúsenosti. :P