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 相关文章推荐
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 PHP
PHP getName()函数讲解
Feb 03 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 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 学习提高路线分享
2011/10/23 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
Python rstrip()方法实例详解
2018/11/11 Python
浅析python参数的知识点
2018/12/10 Python
python颜色随机生成器的实例代码
2020/01/10 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
机电一体化职业规划书
2014/01/07 职场文书
总经理任命书
2014/03/29 职场文书
行政管理专业求职信
2014/07/06 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python