Autor Zpráva
midlan
Profil
Ahoj,

potřebuji radu jak správně nacachovat výstup z PHP. Konkrétně se jedná o malý generátor obrázků. Zkoušel jsem dohledat hotové řešení, ale nejsem z toho moudrý. Potřeboval bych obrázek kešovat na jeden den, s tím že by se server průběžně ptal jestli nedošlo ke změně. Ne že by ke změně obsahu docházelo často, ale když k ní dojde, je potřeba aby se změna projevila hned.

Url vedoucí na ten skript má cca takový tvar:
http://www.example.com/generuj?barva=..&text=...

Zvláštní jsou hlavičky které posílá prohlížeč:
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:cs-CZ,cs;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Pragma:no-cache

Vypadá to, že pokaždé chce novou verzi. Jak ho tedy donutit kešovat? Díky za rady.

EDIT: Potřebuji ještě druhou verzi cachování bez dotazování serveru na změny pro neměnné obrázky (taky vygenerované).
Davex
Profil
midlan:
Potřeboval bych obrázek kešovat na jeden den
Posílej upravenou hlavičku Cache-Control s dobou trvanlivosti (čas v sekundách).

s tím že by se server průběžně ptal jestli nedošlo ke změně
Koho se má server ptát a jak by to udělal?

Ne že by ke změně obsahu docházelo často, ale když k ní dojde, je potřeba aby se změna projevila hned.
Pokud chceš, aby se změna projevila hned, tak se musí ve skriptu implementovat validace pomocí hlaviček If-Modified-Since nebo If-None-Match, což znamená posílat s obrázkem Last-Modified a ETag. V tomto směru by ti měl pomoci Kešovací návod nebo starší příklad, kde bych zvýšil hodnotu u max-age.
midlan
Profil
Davex:
Díky za řešení, něco takového už jsem zkoušel ale nefungovalo. Stejně tak nefunguje ani tohle. Prohlížeč tahá při každém zobrazení stránky s generovanými obrázky všechny znovu ze serveru. Přitom hlavičky odpovědi se zdají v pořádku:
Cache-Control:public, max-age=86400
Connection:Keep-Alive
Content-Length:158013
Content-Type:image/png
Date:Tue, 28 Jul 2015 06:54:00 GMT
Expires:Wed, 29 Jul 2015 06:54:00 GMT
Keep-Alive:timeout=5, max=90
Server:Apache/2.4.10 (Debian)

Vlastně se tak dívám a necachují se ani ostatní obrázky na stránce, které k tomu mají i lepší hlavičky:
Accept-Ranges:bytes
Cache-Control:max-age=604800, public
Connection:Keep-Alive
Content-Length:31476
Content-Type:image/jpeg
Date:Tue, 28 Jul 2015 07:01:29 GMT
ETag:"b16-7af4-4fefedb67bdc0"
Expires:Tue, 11 Aug 2015 07:01:29 GMT
Keep-Alive:timeout=15, max=94
Last-Modified:Fri, 25 Jul 2014 06:41:03 GMT
Server:Apache/2.2.22 (Debian)

Čím je to způsobeno? Prohlížeč mám Chrome Verze 44.0.2403.89 m

//EDIT K původní zprávě: server se nikoho ptát neměl, mělo tam být napsáno prohlížeč.

//EDIT2 tak jsem ještě vyzkoušel Firefox a v něm cachování funguje jak má. Zkouešl jsem v Chrome ještě jiné známé weby a vypadá to, že (alespoň u mě) necachuje vůbec nic.
Kajman
Profil
A kontrolujete cachování v rámci stejného tabu?
Keeehi
Profil
V okně vývojářských nástrojů v Chrome v kterém to asi kontrolujete je možnost vypnout keš, když je otevřené. Nemůže to být tím?
midlan
Profil
Keeehi:
Perfektní už to cachuje! Díky! Tak problém vypadá vyřešený.

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: