在我们生成验证码时会需要直接输入图片,通常会使用到header("Content-type: image/jpeg");来实现,这里就来简单介绍一下。
很多开发中,我们试图使用header("Content-type: image/jpeg");来 输出图片,试图用一些php的图像处理技术,让输出图片更加智能和动感。但我们常常遇到新的问题,除非你规定不同的URL结构,并采用服务器技术将图片缓存,否则很有可能这些输出图片会消耗大量的流量。怎么把它们缓存起来,下次用户访问的时候调用缓存呢?(前提是你的这个图片希望保持不变)
1 2 3 4 5 | session_start();
header( "Cache-Control: private, max-age=10800, pre-check=10800" );
header( "Pragma: private" );
header( "Expires: " . date (DATE_RFC822, strtotime ( " 2 day" )));
|
Salin selepas log masuk
在header("Content-type: image/jpeg");上方添加上面这段代码,它将规定当前页面缓存的时间(两天),并在下一次访问中使用这个缓存时间节点。
接下来判断是否已经有缓存,如果有,就使用缓存。
情况一:如果浏览器对当前页面已经有缓存,那么就直接使用它。
1 2 3 4 5 6 | if (isset( $_SERVER ['HTTP_IF_MODIFIED_SINCE'])){
header('Last-Modified: '. $_SERVER ['HTTP_IF_MODIFIED_SINCE'],true,304);
exit ;
}
|
Salin selepas log masuk
情况二:浏览器缓存了当前页,虽然我们更新了某些图片信息,但来源图片本身没有变化,而且我们希望使用之前的缓存,那么也使用缓存。
1 2 3 4 5 6 7 | $img = "some_image.png" ;
if (isset( $_SERVER ['HTTP_IF_MODIFIED_SINCE']) && ( strtotime ( $_SERVER ['HTTP_IF_MODIFIED_SINCE']) ==
filemtime ( $img ))) {
header('Last-Modified: '. gmdate ('D, d M Y H:i:s', filemtime ( $img )).' GMT',true, 304);
exit ;
}
|
Salin selepas log masuk
当然,有些特殊的情况我们还必须考虑,但上面的代码基本上能够带领我们的思路。对了,记得把它们都放在header("Content-type: image/jpeg")的上面。
接着我们来看个例子吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php
$image = "test.jpg" ;
$max_width = 200;
$max_height = 200;
$size = getimagesize ( $image );
$width = $size [0];
$height = $size [1];
$x_ratio = $max_width / $width ;
$y_ratio = $max_height / $height ;
if (( $width <= $max_width ) && ( $height <= $max_height ))
{
$tn_width = $width ;
$tn_height = $height ;
}
elseif (( $x_ratio * $height ) < $max_height )
{
$tn_height = ceil ( $x_ratio * $height );
$tn_width = $max_width ;
}
else
{
$tn_width = ceil ( $y_ratio * $width );
$tn_height = $max_height ;
}
$src = imagecreatefromjpeg( $image );
$dst = imagecreatetruecolor( $tn_width , $tn_height );
imagecopyresampled( $dst , $src , 0, 0, 0, 0, $tn_width , $tn_height , $width , $height );
header('Content-Type: image/jpeg');
imagejpeg( $dst ,null,100);
imagedestroy( $src );
imagedestroy( $dst );
?>
|
Salin selepas log masuk
Atas ialah kandungan terperinci header()如何输出图片缓存用法实例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!