PHP版网站缓存加快打开速度的方法分享
2015-01-24信息快讯网
PHP版网站缓存加快打开速度的方法分享,需要的朋友可以参考下
说明: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 /** * @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"); } } ?>
解析使用ThinkPHP应该掌握的调试手段
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
php Xdebug的安装与使用详解
解析phpstorm + xdebug 远程断点调试
hadoop常见错误以及处理方法详解
php常用Output和ptions/Info函数集介绍
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
php多个字符串替换成同一个的解决方法
解析PHP生成静态html文件的三种方法
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
基于PHP输出缓存(output_buffering)的深入理解
控制PHP的输出:缓存并压缩动态页面
php将gd生成的图片缓存到memcache的小例子
深入PHP与浏览器缓存的分析
基于php缓存的详解
php安全之直接用$获取值而不$_GET 字符转义
PHP仿盗链代码
PHP通过session id 实现session共享和登录验证的代码
PHP中设置时区方法小结
php 函数中使用static的说明
PHP number_format() 函数定义和用法
php在文件指定行中写入代码的方法
php提示undefined index的几种解决方法
PHP中去掉字符串首尾空格的方法
php的array_multisort()使用方法介绍
PHP中文件缓存转内存缓存的方法
PHP禁止页面缓存的代码
php 文件缓存函数
简单的PHP缓存设计实现代码
PHP缓存技术的使用说明