Toon posts:

[PHP] Caching van afbeelding

Pagina: 1
Acties:
  • 37 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik heb een script wat afbeeldingen verzorgt, wat opzich goed werkt. Het probleem is echter dat de afbeeldingen met geen enkele mogelijkheid gecached willen worden.

Komt dat omdat de plaatjes aangeroepen worden met get-variabelen, waardoor de browser ze automatisch niet cached? (slechts een idee)

Ik heb het al geprobeerd door headers mee te sturen met de afbeelding, zonder resultaat (getest met 3 browsers):
PHP:
1
2
3
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $date) . ' GMT');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 172800) . ' GMT');
header('Cache-Control: public, max-age=172800');


Is er een oplossing hiervoor? Het is namelijk totaal niet nodig om constant alles opnieuw te laden.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $date) . ' GMT');
zit 't 'm daar niet in? Wat staat er in $date?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Daarin staat een timestamp, dat had ook direct gekund (zoals de tweede regel) maar dit is maar een voorbeeld wat ik zelf gevonden had op php.net

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Nou, dan denk ik dat de browser de volgende keer weer de headers opvraagt, en dan ziet dat hij weer gewijzigd is (dat vertelt die eerste header namelijk), dus ik denk dat je daar een constante in moet zetten.

Verwijderd

Topicstarter
Helaas lijkt ook een vaste waarde in het verleden niet te helpen.

Is er iemand op de hoogte van de manier waarop browsers omgaan met URL's met get waarden? Ik heb namelijk in mn zoektocht ook ergens gelezen dat dat mogelijk problemen geeft

  • Speedener
  • Registratie: September 2000
  • Laatst online: 01-12 09:14
PHP:
1
2
3
<?php
header("Pragma: cache");
?>


Verkeerd gelezen: zoiets dan? :?

[ Voor 83% gewijzigd door Speedener op 20-02-2003 22:40 ]


  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 10:29
Hij wil juist wel cachen....

Ik denk inderdaad dat zodra er ook maar 1 parameter in je query anders is, dat het dan niet gecached wordt (als er wel hetzelfde plaatje onder hangt).

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Hoe heb je getest dat hij hem cached? De browser zal namelijk altijd een request doen; maar niet altijd de echte content ophalen als de data hetzelfde is als in de cache (IMHO)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Spider.007 schreef op 20 February 2003 @ 22:55:
Hoe heb je getest dat hij hem cached? De browser zal namelijk altijd een request doen; maar niet altijd de echte content ophalen als de data hetzelfde is als in de cache (IMHO)

Mja voordat hij het weet of de data gelijk is, heeft ie alle data al binnen, anders vergelijkt het zo moeilijk. Of heb je het nu over 304 headers en expires?

Trouwens voor de Topicstarter, misschien is het handig om eens te kijken wat een browser doet bij het opvragen van een plaatje welke wel gechached wordt. Dit kun je doen met een sniffer als ethereal.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Glimi schreef op 20 February 2003 @ 23:00:

[...]

Mja voordat hij het weet of de data gelijk is, heeft ie alle data al binnen, anders vergelijkt het zo moeilijk. Of heb je het nu over 304 headers en expires?

Trouwens voor de Topicstarter, misschien is het handig om eens te kijken wat een browser doet bij het opvragen van een plaatje welke wel gechached wordt. Dit kun je doen met een sniffer als ethereal.
Ik heb het idd over de 304 headers en expires :) misschien heb ik het iets krom neergezet. Maar de suggestie die je geeft over ethereal is idd een goed idee; als de topicstarter toegang heeft tot de logfiles van de webserver kun je daarin ook de return values bekijken (of dat dus 304 is)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

Topicstarter
Ik heb zojuist de logfiles bekeken, en ik ben met ethereal aan de gaan gegaan. Allebei dezelfde uitkomst: er worden geen 304 statussen verzonden/ontvangen.
De statische plaatjes op dezelfde pagina krijgen wel netjes een 304

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Kijk dan wat het verschil tussen de headers ervoor is.
Bij mijn weten kan je in principe die pragma/cache-control headers weglaten en zou het opgeven van een Last-Modified / Expires genoeg moeten zijn. Je hebt kans dat je browser er anders over denkt doordat je get parameters gebruikt, maar dat is met een simpele MultiViews check (iets.php/waarde ipv iets.php?ding=waarde) wel te achterhalen.

Owja, die lastmodified en Expires moeten natuurlijk niet al te raar veranderen bij gebruik he? Als je lastmodified altijd de current time weergeeft, dan zal ie elke keer opgehaald worden :)

[ Voor 20% gewijzigd door ACM op 21-02-2003 09:32 ]


Verwijderd

Topicstarter
Ik heb hier de header van een afbeelding uit het script:
Afbeeldingslocatie: http://myserver.xs4all.nl/header1.png

En hier een normale afbeelding:
Afbeeldingslocatie: http://myserver.xs4all.nl/header2.png

Verwijderd

Topicstarter
Zojuist heb ik een hele simpele versie gemaakt van een afbeelding script zonder GET:
PHP:
1
2
3
4
header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 86400));
header("Cache-Control: public, max-age = 86400");
header('Content-Type: image/gif');
readfile("plaatje.gif");

Wat gebeurd er nu:
- de browser cached de afbeelding (staat in tijdelijke internet bestanden)
- bij een vervolgbezoek komt er geen status 304
- de data van het plaatje wordt daadwerkelijk weer verzonden

Kortom het ligt niet aan de GET variabelen. De zoektocht gaat verder, dus heb ik eens verschillende combinaties genomen:
IIS + IE6 = geen caching :(
IIS + opera = geen caching :(
IIS + netscape = wel caching :?
Apache (op linux server) + IE6 = geen caching :(
Apache (op linux server) + opera = geen caching :(
Apache (op linux server) + netscape = wel caching :?

[edit]

Ik heb nu de volgende headers, het werkt in IE en Netscape, opera helaas niet maar ik laat het hier voorlopig bij:
PHP:
1
2
3
4
header("Cache-Control: public");
$offset = 60 * 60 * 24 * 5;
$expire = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header($expire);

[ Voor 23% gewijzigd door Verwijderd op 21-02-2003 21:21 ]


  • emkedouwe
  • Registratie: September 2001
  • Laatst online: 26-11-2021
Is er iemand die hier inmiddels al een oplossing voor heeft?

Ik zit nu met hetzelfde probleem met een dynamisch resize script. Bij elk verzoek krijg ik status 200 terug zelfs wanneer ik de last-modified en Expires hard in de header zet.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Een topic uit 2003 kicken hiervoor lijkt me een beetje overbodig ;)

Als je een nieuw topic wilt openen voor je probleem dan kan dat natuurlijk prima. Let hierbij wel even op Programming Beleid en dan met name opProgramming Beleid - De Quickstart zodat je weet wat we van een topicstart verwachten.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.