Bekijk Volledige Versie : PHP: Dynamic Image client caching
Tjerk Wolterink
26/02/05, 13:25
Ik genereer een plaatje mbv een dynamisch script,
dus in html ziet het er zo uit
<img src="image.php?width=100" />
Maar nu flikkert het plaatje constant in mijn browser.
Dus ik denk.. dat ligt aan caching... de browser zal het plaatje wel niet cachen.
Dus heb ik in de header van de image het volgende meegestuurd:
Cache-Control: public
Maar dit wil ook niet werken.
Wat moet ik doen?
Maarten Wierda
26/02/05, 14:05
Tjerk Wolterink wrote:
> dus in html ziet het er zo uit <img
> src="image.php?width=100" />
>
> Maar nu flikkert het plaatje constant in mijn browser.
> Dus ik denk.. dat ligt aan caching... de browser zal het
> plaatje wel niet cachen.
<snip>
> Wat moet ik doen?
Ik zal René voor zijn, meer informatie geven over image.php.
--
Cheers,
Maarten Wierda
"After MELVINS finished a 23-minute opener of
'Charmicarmicat', one knob yelled
'Your guitar's tuned now!',
to which Buzz snapped,
'SHUT UP, FAG!!!'... "
Daniel Tryba
26/02/05, 14:05
Tjerk Wolterink <tjerk@wolterinkwebdesign.com> wrote:
> Ik genereer een plaatje mbv een dynamisch script,
>
> dus in html ziet het er zo uit
> <img src="image.php?width=100" />
>
> Maar nu flikkert het plaatje constant in mijn browser.
Huh! Zomaar of tijdens een reload?
> Dus ik denk.. dat ligt aan caching... de browser zal het plaatje wel
> niet cachen.
>
> Dus heb ik in de header van de image het volgende meegestuurd:
>
> Cache-Control: public
Dan mag er gecached worden.
> Maar dit wil ook niet werken. Wat moet ik doen?
Je moet echter ook nog even een mechanisme verzinnen waarmee de
geldigheid van de eventueel door de browser gecachte content kan worden
vastgesteld.
Normaal gesproken stuurt men voor statische content een last-modified
header mee. Daarmee weet de browser dus of het cached image nog actueel
is, tevens kunnen dan conditionele requests naar genoemde URL gemaakt
worden (als in: if-not-modified-since (of juist if-modified-since)). Aan
jou php script om dan zinnig af te handelen (in de head/get/post requests).
Andere veelvuldig gebruikte methode is om een expires header mee tegeven
met een tijd tot welke de url geldig is, als het plaatje sporadisch
veranderd maar vrijwel nooit binnen een "sessie" zou je dat bv 1 uur in
de toekomst kunnen zetten.
Een en ander staat omslachtigomschreven in de betreffende rfc:
2616 HTTP/1.1
Daniel Tryba
26/02/05, 14:15
Daniel Tryba <spam@tryba.invalid> wrote:
> Aan jou php script om dan zinnig af te handelen (in de head/get/post
> requests).
Voorbeeld code uit smarty, met zo te zien de nodige lamheid in timestamp
controle:
if ($this->cache_modified_check) {
$_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
$_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
$_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
if (@count($this->_cache_info['insert_tags']) == 0
&& !$this->_cache_serials
&& $_gmt_mtime == $_last_modified_date) {
if (php_sapi_name()=='cgi')
header("Status: 304 Not Modified");
else
header("HTTP/1.1 304 Not Modified");
} else {
header("Last-Modified: ".$_gmt_mtime);
echo $_smarty_results;
}
}
Tjerk Wolterink
26/02/05, 15:15
Maarten Wierda wrote:
> Tjerk Wolterink wrote:
>
>> dus in html ziet het er zo uit <img
>> src="image.php?width=100" />
>>
>> Maar nu flikkert het plaatje constant in mijn browser. Dus ik denk..
>> dat ligt aan caching... de browser zal het
>> plaatje wel niet cachen.
>
>
> <snip>
>
>> Wat moet ik doen?
>
>
> Ik zal René voor zijn, meer informatie geven over image.php.
>
mm ik snap niet waarom je daar meer info over wil.
Het gaat toch in principe alleen over de http headers die ik mee stuur?
maarja:
<?php
/**
* This script creates thumbnails
* from uploaded images.
* This wil reduce network traffic and
* increase the speed of the site to show up
*/
include "logic.php";
$image=array_key_exists("image", $_GET) ? $_GET["image"] : false;
$newwidth=array_key_exists("width", $_GET) ? $_GET["width"] : false;
$newheight=array_key_exists("height", $_GET) ? $_GET["height"] : false;
$filename=$upload_dir."/".$image;
if($image==false || !file_exists($filename)) {
die("image does not exists");
}
list($width, $height, $type, $attr)=getimagesize($filename);
header("Content-type: ".image_type_to_mime_type($type));
header("Cache-Control: public");
$img=imagecreatefromfile($filename);
$resized_img=resize_image($img, $width, $height, $newwidth, $newheight);
$resized_shadow_img=image_dropshadow(
$resized_img,
$newwidth, $newheight,
array("r"=>231, "g"=>214, "b"=>247)
);
outputimage($resized_shadow_img, $type);
imagedestroy($resized_img);
imagedestroy($resized_shadow_img);
imagedestroy($img);
?>