PHP使用header()输出图片缓存实例


Posted in PHP onDecember 09, 2014

本文实例讲述了PHP使用header()输出图片缓存的方法。分享给大家供大家参考。具体分析如下:

在我们生成验证码时会需要直接输入图片,通常会使用到header("Content-type: image/jpeg");来实现,这里就来简单介绍一下。

很多开发中,我们试图使用header("Content-type: image/jpeg");来 输出图片,试图用一些php的图像处理技术,让输出图片更加智能和动感。但我们常常遇到新的问题,除非你规定不同的URL结构,并采用服务器技术将图片缓存,否则很有可能这些输出图片会消耗大量的流量。怎么把它们缓存起来,下次用户访问的时候调用缓存呢?(前提是你的这个图片希望保持不变)

// put this above any php image generation code:

session_start(); 

header("Cache-Control: private, max-age=10800, pre-check=10800");

header("Pragma: private");

header("Expires: " . date(DATE_RFC822,strtotime(" 2 day")));

在header("Content-type: image/jpeg");上方添加上面这段代码,它将规定当前页面缓存的时间(两天),并在下一次访问中使用这个缓存时间节点。
接下来判断是否已经有缓存,如果有,就使用缓存。

情况一:如果浏览器对当前页面已经有缓存,那么就直接使用它。

// the browser will send a $_SERVER['HTTP_IF_MODIFIED_SINCE'] if it has a cached copy 

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){

  // if the browser has a cached version of this image, send 304

  header('Last-Modified: '.$_SERVER['HTTP_IF_MODIFIED_SINCE'],true,304);

  exit;

}

情况二:浏览器缓存了当前页,虽然我们更新了某些图片信息,但来源图片本身没有变化,而且我们希望使用之前的缓存,那么也使用缓存。
$img = "some_image.png";

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime($img))) {

  // send the last mod time of the file back

  header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($img)).' GMT',true, 304);

  exit;

}

当然,有些特殊的情况我们还必须考虑,但上面的代码基本上能够带领我们的思路。对了,记得把它们都放在header("Content-type: image/jpeg")的上面。
接着我们来看个例子吧
<?php

//调整图片大小

/**

 *图片按比例调整大小的原理:

 *1、比较原图大小是否小于等于目标大小,如果是则直接采用原图宽高

 *2、如果原图大小超过目标大小,则对比原图宽高大小

 *3、如:宽>高,则宽=目标宽, 高=目标宽的比例 * 原高

 *4、如:高>宽,则高=目标高,宽=目标高的比例 * 原宽   

**/

 

$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);

?>

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
Access数据库导入Mysql的方法之一
Oct 09 PHP
php操作excel文件 基于phpexcel
Jul 02 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
基于php缓存的详解
May 15 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
wordpress网站转移到本地运行测试的方法
Mar 15 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 PHP
PHP实现服务器状态监控的方法
Dec 09 #PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 #PHP
php实现MySQL数据库备份与还原类实例
Dec 09 #PHP
两个php日期控制类实例
Dec 09 #PHP
php中Ctype函数用法详解
Dec 09 #PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 #PHP
thinkphp缓存技术详解
Dec 09 #PHP
You might like
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
php下使用无限生命期Session的方法
2007/03/16 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
python3中set(集合)的语法总结分享
2017/03/24 Python
git进行版本控制心得详谈
2017/12/10 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
基于python实现计算两组数据P值
2020/07/10 Python
在线课程:Skillshare
2019/04/02 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
教师年终个人自我评价
2013/10/04 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
物流管理专业求职信
2014/05/29 职场文书
安全员岗位职责
2015/02/10 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
python urllib库的使用详解
2021/04/13 Python
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL