PHP版网站缓存加快打开速度的方法分享


Posted in PHP onJune 03, 2012

说明:
1,在服务器缓存了压缩过的文件,再次访问减少再压缩时间,降低CPU占用率。
2,通过设置客户端文件缓存时间,降低再次请求次数,可降低85%以上。
3,图片因为已经是压缩格式,只是设置客户端缓存时间,不做压缩处理。

使用方法:
1,服务器必须支持gzip,Rewrite功能。
2,在.htacess文件的“RewriteBase /”下面一行添加下面的代码,见图
RewriteRule (.*.css$|.*.js$|.*.jpg$|.*.gif$|.*.png$) gzip.php?$1 [L]
3,上传gzip.php到根目录
4,在根目录建cache文件夹,保证可读写。

PHP版网站缓存加快打开速度的方法分享

<?php 
/** 
* @author Seraphim 
* @copyright 2012 
*/ 
// <!-- 公共的返回header的子程序 --> 
function sendheader($last_modified, $p_type, $content_length = 0) 
{ 
// 设置客户端缓存有效时间 
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 15360000) . "GMT"); 
header("Cache-Control: max-age=315360000"); 
header("Pragma: "); 
// 设置最后修改时间 
header("Last-Modified: " . $last_modified); 
// 设置文件类型信息 
header($p_type); 
header("Content-Length: " . $content_length); 
} 
define('ABSPATH', dirname(__file__) . '/'); 
$cache = true; 
$cachedir = 'cache/'; //存放gz文件的目录,确保可写 
if (empty($_SERVER['QUERY_STRING'])) 
exit(); 
$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); 
if (empty($gzip)) 
$cache = false; 
$key = array_shift(explode('?', $_SERVER['QUERY_STRING'])); 
$key = str_replace('../', '', $key); 
$filename = ABSPATH . $key; 
$symbol = '_'; 
$rel_path = str_replace(ABSPATH, '', dirname($filename)); 
$namespace = str_replace('/', $symbol, $rel_path); 
$cache_filename = ABSPATH . $cachedir . $namespace . $symbol . basename($filename) . 
'.gz'; //生成gz文件路径 
$ext = array_pop(explode('.', $filename)); //根据后缀判断文件类型信息 
$type = "Content-type: text/html"; //默认的文件类型 
switch ($ext) 
{ 
case 'css': 
$type = "Content-type: text/css"; 
break; 
case 'js': 
$type = "Content-type: text/javascript"; 
break; 
case 'gif': 
$cache = false; 
$type = "Content-type: image/gif"; 
break; 
case 'jpg': 
$cache = false; 
$type = "Content-type: image/jpeg"; 
break; 
case 'png': 
$cache = false; 
$type = "Content-type: image/png"; 
break; 
default: 
exit(); 
} 
if ($cache) 
{ 
if (file_exists($cache_filename)) 
{ // 假如存在gz文件 
$mtime = filemtime($cache_filename); 
$gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT'; 
if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) == 
$gmt_mtime)) 
{ 
// 与浏览器cache中的文件修改日期一致,返回304 
header("HTTP/1.1 304 Not Modified"); 
// 发送客户端header 
header("Content-Encoding :gzip"); 
sendheader($gmt_mtime, $type); 
} 
else 
{ 
// 读取gz文件输出 
$content = file_get_contents($cache_filename); 
// 发送客户端header 
sendheader($gmt_mtime, $type, strlen($content)); 
header("Content-Encoding: gzip"); 
// 发送数据 
echo $content; 
} 
} 
else 
if (file_exists($filename)) 
{ // 没有对应的gz文件 
$mtime = mktime(); 
$gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT'; 
// 读取文件 
$content = file_get_contents($filename); 
// 去掉空白的部分 
// $content = ltrim($content); 
// 压缩文件内容 
$content = gzencode($content, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE); 
// 发送客户端header 
sendheader($gmt_mtime, $type, strlen($content)); 
header("Content-Encoding: gzip"); 
// 发送数据 
echo $content; 
// 写入文件 
file_put_contents($cache_filename, $content); 
} 
else 
{ 
header("HTTP/1.0 404 Not Found"); 
} 
} 
else 
{ // 处理不使用Gzip模式下的输出。原理基本同上 
if (file_exists($filename)) 
{ 
$mtime = filemtime($filename); 
$gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT'; 
if ((isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && array_shift(explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'])) == 
$gmt_mtime)) 
{ 
// 与浏览器cache中的文件修改日期一致,返回304 
header("HTTP/1.1 304 Not Modified"); 
// 发送客户端header 
sendheader($gmt_mtime, $type, strlen($content)); 
header("Content-Encoding :gzip"); 
} 
else 
{ 
// 读取文件输出 
$content = file_get_contents($filename); 
// 发送客户端header 
sendheader($gmt_mtime, $type, strlen($content)); 
// 发送数据 
echo $content; 
} 
} 
else 
{ 
header("HTTP/1.0 404 Not Found"); 
} 
} 
?>
PHP 相关文章推荐
php sprintf()函数让你的sql操作更安全
Jul 23 PHP
php 归并排序 数组交集
May 10 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
php单文件版在线代码编辑器
Mar 12 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
PHP实现根据时间戳获取周几的方法
Feb 26 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
PHP yield关键字功能与用法分析
Jan 03 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 PHP
php libevent 功能与使用方法详解
Mar 04 PHP
PHP仿盗链代码
Jun 03 #PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 #PHP
PHP中设置时区方法小结
Jun 03 #PHP
php 函数中使用static的说明
Jun 01 #PHP
PHP number_format() 函数定义和用法
Jun 01 #PHP
分享一个PHP数据流应用的简单例子
Jun 01 #PHP
检查php文件中是否含有bom的函数
May 31 #PHP
You might like
php中的数组操作函数整理
2008/08/18 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
php制作简单模版引擎
2016/04/07 PHP
PHP分享图片的生成方法
2018/04/25 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
详解前后端分离之VueJS前端
2017/05/24 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
浅入深出Vue之组件使用
2019/07/11 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python 输出上个月的月末日期实例
2018/04/11 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
土木工程应届生求职信
2013/10/31 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
个人考核材料
2014/05/15 职场文书
消防安全承诺书
2014/05/22 职场文书
运动会入场口号
2014/06/07 职场文书
文艺晚会策划方案
2014/06/11 职场文书
Nginx安装配置详解
2022/06/25 Servers
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python