-
11. Data: 2010-11-19 20:16:57
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
W dniu 2010-11-19 19:09, Paweł Piskorz pisze:
> Nie wiem w czym go ustawiasz, ale na prawdę nie jest tak trudno dodać
> 100 sekund do bieżącej daty.
Przepraszam, przymulony jestem. Za dużo pracy...
Wygląda na to, że ten nagłówek kompletnie niczego nie zmienia albo źle
zarządzam nagłówkami. Zerknij na to co poniżej. Wchodzę na stronę
pierwszy raz. Browser wysyła nagłówki zapytania (w/g firebuga,
uwzględniam istotne dla sprawy jedynie):
Pragma no-cache
Cache-Control no-cache
W odpowiedzi (200) dostaję:
Date Fri, 19 Nov 2010 20:07:54 GMT
Server Apache
Expires Fri, 19 Nov 2010 20:08:54 GMT
Cache-Control must-revalidate
Pragma no-cache
Last-Modified Wed, 17 Nov 2010 12:14:04 GMT
Zauważ, że ustawiłem 60 sekund na wygaśnięcie. Klikam sobie jakiś link w
serwisie WWW aby wylądować na innej wewnętrznej stronie. Po przeszło
minucie znów klikam na link prowadzący do strony j/w. Zapytanie browsera
zawiera nagłówki:
If-Modified-Since Wed, 17 Nov 2010 12:28:07 GMT
A odpowiedź (304):
Date Fri, 19 Nov 2010 20:10:07 GMT
Server Apache
Expires Fri, 19 Nov 2010 20:11:07 GMT
Cache-Control must-revalidate
Pragma no-cache
Last-Modified Wed, 17 Nov 2010 12:28:07 GMT
Po stronie PHP mogę badać tylko nagłówek If-Modified-Since bo nic innego
Firefox mi nie przesyła. Nie mam więc narzędzia determinującego czy mam
odesłać 200 czy 304.
-
12. Data: 2010-11-19 20:43:11
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
W dniu 2010-11-19 19:56, porneL pisze:
>
> Jeżeli dokument został zmodyfikowany 2 dni temu, to jest taki sam teraz
> jak i 100 sekund temu.
>
> Jeżeli przeglądarka ma dokument z datą sprzed 2ch dni, a ty go
> zmodyfikowałeś wczoraj, to zauważysz, że musisz wysłać nowy.
>
> Chyba, że wysyłasz zupełnie fikcyjny last-modified. Wtedy to twój
> problem...
No to już prawie u celu jesteśmy. Zaraz wyślę Ci odpowiedź odnośnie tego
co poniżej napisałeś.
-
13. Data: 2010-11-19 20:51:17
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
W dniu 2010-11-19 19:53, porneL pisze:
>
> Informuje cię o tym wykonując zapytanie(przed upływem 100 sekund po
> prostu nie wykona zapytania).
Badając działanie max-age dociekałem dlaczego zawsze odpytuje mi serwer
i to serwer wysyła 304. Wstępnie zakładałem, że jeśli nie minie te 100
sekund to browser powinien cicho siedzieć przy kolejnych wizytach danego
URL. Dopiero po setnej sekundzie powinien zapytać serwera o to czy coś
się zmieniło. Dopiero wtedy serwer powinien wysłać 304 i mieć spokój od
przeglądarki przez kolejne 100 sekund. Prawda? A dlaczego tak nie jest?
A jak do tego doszedłem? A mianowicie w taki sposób:
1. Wchodzę na dany URL (po raz kolejny).
2. Serwer wysyła:
header('HTTP/1.1 304 Not Modified A');
3. Wchodzę na jakiś link wewnętrzny w serwisie (inna strona).
4. Zmieniam w PHP
header('HTTP/1.1 304 Not Modified B');
5. Klikam na link prowadzący do adresu URL jak w p.1
6. Firebug pokazuje mi odpowiedź 304 z literką B.
Czyli musiało dojść do niechcianej komunikacji. Czyli serwer spełnił
funkcję validatora a nie miał.
-
14. Data: 2010-11-19 22:24:30
Temat: Re: Jak działa nagłówek max-age?
Od: porneL <n...@p...net>
> W odpowiedzi (200) dostaję:
>
> Date Fri, 19 Nov 2010 20:07:54 GMT
> Server Apache
> Expires Fri, 19 Nov 2010 20:08:54 GMT
> Cache-Control must-revalidate
> Pragma no-cache
> Last-Modified Wed, 17 Nov 2010 12:14:04 GMT
>
>
> Zauważ, że ustawiłem 60 sekund na wygaśnięcie.
Ustawiłeś sprzeczne informacje.
Cache-control: must-revalidate oznacza, że przeglądarka *musi* *za każdym
razem* wysyłać zapytanie do serwera, żeby sprawdzić, czy ma świeży cache.
no-cache, must-revalidate, itp. są odwrotnością max-age.
must-revalidate jest nawet mocniejsze od no-cache (które też masz, tylko w
stylu z lat 90tych), bo no-cache wolno używać off-line, a must-revalidate
nie.
--
http://pornel.net
this.author = new Geek("porneL");
-
15. Data: 2010-11-20 10:14:23
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
W dniu 2010-11-19 23:24, porneL pisze:
>
>> W odpowiedzi (200) dostaję:
>>
>> Date Fri, 19 Nov 2010 20:07:54 GMT
>> Server Apache
>> Expires Fri, 19 Nov 2010 20:08:54 GMT
>> Cache-Control must-revalidate
>> Pragma no-cache
>> Last-Modified Wed, 17 Nov 2010 12:14:04 GMT
>>
>>
>> Zauważ, że ustawiłem 60 sekund na wygaśnięcie.
>
> Ustawiłeś sprzeczne informacje.
A tak, to pomyłka. Eksperymentowałem tu z różnymi ustawieniami tak aby
Expires mogło zadziałać. Zapomniałem przywrócić wartość "public",
przepraszam.
W drugim kroku usunąłem Expires i ustawiałem Cache-Control na public,
private, max-age (=0 i 100), no-cache. Ze zdumieniem stwierdziłem, że
nie wpływa to na nic kompletnie. Zachowują się te wartości tak jak
must-revalidate. Czyli do serwera leci if-modified-since a on musi
odpowiedzieć wtedy 304. Co ciekawe - dotyczy to WYŁĄCZNIE pliku
określonego przez URL. Cache poprawnie działa (nie próbuje pobierać)
plików typu JS/CSS/obrazki gdzie wysyłam identyczne nagłówki. W nich
również ustawiam m.in. max-age, choć dodatkowo Etag również. Dorzuciłem
eksperymentalnie Etag do pliku wskazywanego przez URL lecz to niczego
nie zmieniło w cacheowaniu - przeglądarka wysyła do CMS jeden nagłówek
więcej if-none-match w odpowiedzi - to jedyna różnica. Wygląda na to, że
plik wskazywany przez URL zachowuje się zawsze tak jakby miał ustawione
"must-revalidate". Przerzuca validowanie czasu na serwer.
Poniżej załączam istotne nagłówki dla pliku graficznego (czytanego
dynamicznie z bazy - nie ma go na dysku), który jest cacheowany a
jeszcze niżej dla omawianego dokumentu, który wymaga validacji serwera.
Szczerze mówiąc nie widzę różnicy, która wymusza validację dla dokumentu.
Plik graficzny zapytanie:
GET /readfile/PICT3998.jpg HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.12)
Gecko/20101026 Firefox/3.6.12
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PHPSESSID=03f97454afa9d17e77c2cdc2f2260fff
If-Modified-Since: Sat, 20 Nov 2010 10:12:11 GMT
If-None-Match: "1-1290244331"
Cache-Control: max-age=0
Plik graficzny odpowiedź:
HTTP/1.1 304 Not Modified
Date: Sat, 20 Nov 2010 09:58:12 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=15, max=99
Etag: 1-1290244331
Cache-Control: max-age=600
Vary: Accept-Encoding
Dokument zapytanie:
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.12)
Gecko/20101026 Firefox/3.6.12
Accept: text/html,application/xhtml+xml,application/xml;q=0.
9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PHPSESSID=03f97454afa9d17e77c2cdc2f2260fff
If-Modified-Since: Sat, 20 Nov 2010 09:19:22 GMT
Cache-Control: max-age=0
Dokument odpowiedź:
HTTP/1.1 304 Not Modified
Date: Sat, 20 Nov 2010 09:58:12 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=15, max=96
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: max-age=60
Vary: Accept-Encoding
Nagłówek Expires sam się dokleja. Jego ustawienie w PHP na teraz plus to
co jest w max-age nie ma wpływu. Oto dowód:
Dokument zapytanie:
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.12)
Gecko/20101026 Firefox/3.6.12
Accept: text/html,application/xhtml+xml,application/xml;q=0.
9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PHPSESSID=03f97454afa9d17e77c2cdc2f2260fff
If-Modified-Since: Sat, 20 Nov 2010 09:19:22 GMT
Dokument odpowiedź:
HTTP/1.1 304 Not Modified
Date: Sat, 20 Nov 2010 10:10:22 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=15, max=99
Expires: Sat, 20 Nov 2010 10:11:22 GMT
Cache-Control: max-age=60
Vary: Accept-Encoding
-
16. Data: 2010-11-20 11:47:20
Temat: Re: Jak działa nagłówek max-age?
Od: porneL <n...@p...net>
On Sat, 20 Nov 2010 10:14:23 -0000, Marek <b...@e...com> wrote:
> Dokument zapytanie:
> GET / HTTP/1.1
> Cache-Control: max-age=0
Wygląda jakbyś kazał przegądarce odświeżyć stronę.
--
http://pornel.net
this.author = new Geek("porneL");
-
17. Data: 2010-11-20 14:15:23
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
W dniu 2010-11-20 12:47, porneL pisze:
> On Sat, 20 Nov 2010 10:14:23 -0000, Marek <b...@e...com> wrote:
>
>> Dokument zapytanie:
>> GET / HTTP/1.1
>
>> Cache-Control: max-age=0
>
> Wygląda jakbyś kazał przegądarce odświeżyć stronę.
Hej, to nie ja tylko przeglądarka :-) Ja wysyłam do przeglądarki max-age
60 dla dokumentów lub 600 dla plików w tym przypadku. Gdy wchodzimy
ponownie na dokument, w ramach którego to wysłałem, to przeglądarka robi
GET'a przesyłając niz gruszki ni z pietruszki Cache-Control: max-age=0
DO SERWERA.
-
18. Data: 2010-11-20 14:22:42
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
Tak dla usystematyzowania, w moim opisie zapytanie to jest wiadomość
wysłana z przeglądarki do serwera, a odpowiedź - w drugą stronę. Nie
wiem po co przeglądarka do serwera wysyła Cache-control. Przynajmniej
tak firebug "twierdzi". W każdym razie ignoruję to i sprawdzam jedynie
if-modified-since.
Na wszelki wypadek przypomnę też, że zależy mi na pełnym cache'owaniu
niektórych stron - spowodowaniu aby przeglądarka w ogóle nie odpytywała
serwera przez pewien czas od momentu ostatnich odwiedzin. Nie potrafię
tego spowodować w stosunku do pliku PHP generującego HTML i bez problemu
potrafię dla wszystkich includów (CSS, JS, obrazki).
-
19. Data: 2010-11-20 14:41:49
Temat: Re: Jak działa nagłówek max-age?
Od: porneL <n...@p...net>
On Sat, 20 Nov 2010 14:22:42 -0000, Marek <b...@e...com> wrote:
> Tak dla usystematyzowania, w moim opisie zapytanie to jest wiadomość
> wysłana z przeglądarki do serwera, a odpowiedź - w drugą stronę. Nie
> wiem po co przeglądarka do serwera wysyła Cache-control.
To dziwne. Normalnie przeglądarki tego nie wysyłają, chyba że wciśniesz F5
lub podobne.
> Na wszelki wypadek przypomnę też, że zależy mi na pełnym cache'owaniu
> niektórych stron - spowodowaniu aby przeglądarka w ogóle nie odpytywała
> serwera przez pewien czas od momentu ostatnich odwiedzin. Nie potrafię
> tego spowodować w stosunku do pliku PHP generującego HTML i bez problemu
> potrafię dla wszystkich includów (CSS, JS, obrazki).
Cache-Control: max-age albo nawet samo Expires powinno wystarczyć do tego.
W PHP session.cache_limiter totalnie psuje cache.
--
http://pornel.net
this.author = new Geek("porneL");
-
20. Data: 2010-11-20 18:07:32
Temat: Re: Jak działa nagłówek max-age?
Od: Marek <b...@e...com>
W dniu 2010-11-20 15:41, porneL pisze:
>
> Cache-Control: max-age albo nawet samo Expires powinno wystarczyć do
> tego. W PHP session.cache_limiter totalnie psuje cache.
>
Ahhh, to w tym rzecz! Słyszałem o tym lecz nie miałem okazji usłyszeń
uzasadnienia. Na czym w zasadzie polega psucie cache przez PHP?
Teoretycznie PHP tylko cookie śle. Czy coś odbywa się wbrew RFC?