/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Caching af PHP-genereret CSS
Fra : Martin Larsen


Dato : 12-11-08 22:23

Hej gruppe

Jeg er ellers noget af en PHP haj, men det her volder mig godt nok
problemer! Et par timers googling har endnu ikke båret frugt.

Jeg har en PHP-generet CSS fil, dvs. en fil hvor indholdet
tilsyneladende er ren CSS, men det har lige været en tur forbi serveren
og modificeret via PHP. Det gør jeg i .htaccess, så filen udadtil stadig
hedder fx test.css. Og altså set fra browserens synspunkt burde være som
alle andre CSS filer.

Det virker da også fortrinligt, MEN .... filen bliver ikke cached.

Jeg har forsøgt med mindst 20 forskellige variationer over temaet:


Header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
Header($ExpStr);


Desværre har intet af det virket. Jeg vil blive mægtig glad for at få at
vide hvad der skal til for at skidtet bliver cached.

Det er i øvrigt på en Apache server.

Hilsen
Martin

 
 
Dan Storm (13-11-2008)
Kommentar
Fra : Dan Storm


Dato : 13-11-08 08:29

Martin Larsen skrev:
> Det virker da også fortrinligt, MEN .... filen bliver ikke cached.

Modificerer du den hver gang en bruger besøger siden?



--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

Martin Larsen (13-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 13-11-08 16:15

Dan Storm wrote:

> Modificerer du den hver gang en bruger besøger siden?

Nej. Det er afhængig af browsertypen og modificeres altså ikke ved hver
request.

Martin

Dan Storm (13-11-2008)
Kommentar
Fra : Dan Storm


Dato : 13-11-08 21:54

Martin Larsen skrev:
> Nej. Det er afhængig af browsertypen og modificeres altså ikke ved hver
> request.

Så det er altså for at imødekomme de forskellige browseres forskelligheder?

Hvis du gerne vil lave en PHP løsning på det, var det så ikke bedre at
lave de stylesheets du skal bruge:
<?php
if(eregi('msie', $_SERVER["HTTP_USER_AGENT"]))
   $stylesheet = "ie-styles.css";
else
   $stylesheet = "ff-styles.css";
?>

<link type="text/css" rel="stylesheet" href="<?php echo $stylesheet; ?>" />



--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

Martin Larsen (14-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 14-11-08 09:26

Dan Storm wrote:

> Så det er altså for at imødekomme de forskellige browseres forskelligheder?
>
> Hvis du gerne vil lave en PHP løsning på det, var det så ikke bedre at
> lave de stylesheets du skal bruge:


Jo, det er absolut også en løsning. Men af forskellige årsager er det
ikke ønskeligt her.

Desuden skal det også bruges til at andre php-genererede ting som vi
ønsker at cache. Fx Javascript.

Med andre ord ønsker jeg også at forstå i detaljer præcis hvordan
caching virker, eller rettere, hvordan browser og server i fællesskab
"aftaler" hvad der skal gøres

martin

Carsten (13-11-2008)
Kommentar
Fra : Carsten


Dato : 13-11-08 10:34

"Martin Larsen" <want@no.spam> skrev i en meddelelse
news:gffhfj$1e2u$1@newsbin.cybercity.dk...
> Jeg er ellers noget af en PHP haj, men det her volder mig godt nok
> problemer! Et par timers googling har endnu ikke båret frugt.
>
> Jeg har en PHP-generet CSS fil, dvs. en fil hvor indholdet tilsyneladende
> er ren CSS, men det har lige været en tur forbi serveren og modificeret
> via PHP. Det gør jeg i .htaccess, så filen udadtil stadig hedder fx
> test.css. Og altså set fra browserens synspunkt burde være som alle andre
> CSS filer.
>
> Det virker da også fortrinligt, MEN .... filen bliver ikke cached.

hmmm, det du siger er at ...

i klient-"programmet" (en html fil velsagtens) står der noget a la det her
??

<link rel="stylesheet" type="text/css" href="text.css">

Det får jo broseren til at fyre en GET request af mod din webserver .. lidt
som:

GET /text.css HTTP/1.1
host: www.yoursite.dk
If-Modified-Since: Sat, 29 Nov 2008 19:43:31 GMT (=det tidspunkt hvor
browseren sidst fik en "ny" text.css)
(more headers here)

Nu kigger din webserver så på den request og siger til sig selv... "Hmmm,
den text.css jeg har (lige autogenereret) er jo nyere end det som ham
browser-fætteren angiver, så jeg må hellere stikke ham en ny". Det er
grunden til at den ikke caches.

Nu ved jeg ikke om din "text.css" rent faktisk kan ændre sig fra sekund til
sekund, men jeg har tidligere haft samme problem med en "liste af kunder"
drop down og her valgte jeg en lidt anden løsning. Jeg lod serveren
autogenerere en ny liste, men førend jeg skrev den ned i "text.css" så
undersøgte jeg lige om den nye liste rent faktisk var forskellig fra den
forrige - hvis ikke så blev der ikke dannet en ny fil. Hvis den var ændret
blev der dannet en ny fil, og så ville browseren selvsagt få en ny.

Carsten



Martin Larsen (14-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 14-11-08 09:29

Hej Carsten

> Nu kigger din webserver så på den request og siger til sig selv... "Hmmm,
> den text.css jeg har (lige autogenereret) er jo nyere end det som ham
> browser-fætteren angiver, så jeg må hellere stikke ham en ny". Det er
> grunden til at den ikke caches.

Jeg kan godt se hvad du mener, og det understøttes af hvad jeg ser i
Apaches logfil.

Når den dynamiske css fil fyres af, sendes en 200 OK tilbage til
browseren, sammen med indholdet. Mens når browseren beder om den
statiske css, så sender serveren en 304 Not Modified tilbage.

Der er dog stadig nogle ting jeg ikke helt kan greje, så når jeg har
analyseret lidt mere, vil jeg nok lige vende tilbage til tråden

Martin

Stig Johansen (13-11-2008)
Kommentar
Fra : Stig Johansen


Dato : 13-11-08 20:14

Martin Larsen wrote:

> Jeg har en PHP-generet CSS fil, dvs. en fil hvor indholdet
> tilsyneladende er ren CSS, men det har lige været en tur forbi serveren
> og modificeret via PHP. Det gør jeg i .htaccess, så filen udadtil stadig
> hedder fx test.css. Og altså set fra browserens synspunkt burde være som
> alle andre CSS filer.
>
> Det virker da også fortrinligt, MEN .... filen bliver ikke cached.
>
> Jeg har forsøgt med mindst 20 forskellige variationer over temaet:

Har du forsøgt at sætte en Last-Modified header?
Det er den sammenholdt med If-Modified-Since fra browseren, der styrer cache
eller ej.

(Eller E-tag i nogle situationer).

--
Med venlig hilsen
Stig Johansen

Martin Larsen (14-11-2008)
Kommentar
Fra : Martin Larsen


Dato : 14-11-08 09:32

Stig Johansen wrote:

> Har du forsøgt at sætte en Last-Modified header?
> Det er den sammenholdt med If-Modified-Since fra browseren, der styrer cache
> eller ej.

Ja ...

> (Eller E-tag i nogle situationer).

Her er nok en del af svaret, for via min snifferproxy kan jeg se hvad de
taler om undervejs, server og browser. Og anden gang jeg beder om filen
(den almindelige, statiske) så sender browseren etag'en tilbage til
serveren sammen med Last-Modified osv.

Har dog ikke rigtig styr på hvordan jeg benytter mig af etaggen.

Martin

Stig Johansen (14-11-2008)
Kommentar
Fra : Stig Johansen


Dato : 14-11-08 11:26

Martin Larsen wrote:

> taler om undervejs, server og browser. Og anden gang jeg beder om filen
> (den almindelige, statiske) så sender browseren etag'en tilbage til
> serveren sammen med Last-Modified osv.

Lidt ude af context, men Proxytrace har vi brugt i lang tid til den slags
ting.

<http://www.pocketsoap.com/>

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste