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连接access数据库
Mar 27 PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
Laravel 5框架学习之表单
Apr 08 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
PHP SPL标准库中的常用函数介绍
May 11 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
Yii针对添加行的增删改查操作示例
Oct 18 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
Yii框架应用组件用法实例分析
May 15 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 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/11/20 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
ucenter通信原理分析
2015/01/09 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
js实现轮播图特效
2020/05/28 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
详谈python read readline readlines的区别
2017/09/22 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
如何使用PHP session
2015/04/21 面试题
电气自动化专业职业规划范文
2014/02/16 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript