php页面缓存方法小结


Posted in PHP onJanuary 10, 2015

本文实例总结了php页面缓存方法。分享给大家供大家参考。具体分析如下:

在php页面缓存主要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),但是更高级的缓存是不使用这些函数的,本文最后会举一个实例加以说明.

先来看看缓存常用的ob系列函数:

ob_start():页面缓存开始的标志,此函数一下的内容直至ob_end_flush()或者ob_end_clean()都保存在页面缓存中;

ob_get_contents():用来获取页面缓存中的内容,获取到以后呢,我们就可以想怎么处理这些内容都行了,过滤字段啦,匹配内容啦,都可以~~~

ob_end_flush():表示页面缓存结束,并且经我验证,缓存的内容将输出到当前页面上,也就是可以显示缓存内容.

用此三个php函数,就可以实现强大的功能,如果数据库查询量较大,可以用cache来解决这个问题.

下面是编码部分.

1.初始化函数,一般是设置页面缓存路径、缓存文件命名格式等,可按个人喜好自定义,这里用到的识别ID是经加密的$_SERVER[REQUEST_URI]参数,这个函数中最后还有一个if判断,若未过缓存期,则加载缓存文件,否则加载源文件,代码如下:

function page_init() 

{     

     $url = $_SERVER['REQUEST_URI'];//子url,该参数一般是唯一的 

     $pageid = md5($url); 

     $dir = str_replace('/','_',substr($_SERVER['SCRIPT_NAME'],1,-4)); 

         //目录命名方式,如exp_index 

     if(!file_exists($pd = PAGE_PATH.$dir.'/'))@mkdir($pd,0777) or die("$pd目录创建失败"); 

         //如cache/page/exp_index/ 

     define('PAGE_FILE',$pd.$pageid.'.html'); 

     //如cache/page/exp_index/cc8ef22b405566745ed21305dd248f0e.html 

     $contents = file_get_contents(PAGE_FILE);//读出 

 

     if($contents && substr($contents, 13, 10) > time() )//对应page_cache()函数中加上的自定义头部 

     { 

         echo substr($contents, 27); 

         exit(0); 

     } 

     return true;     

}

2.页面缓存函数,这里使用到一个技巧,在缓存文件的内容中加上一个头部信息--过期时间,所以每次只需要对头部中的过期时间和当前时间进行比较,在page_init()函数中进行,就能判断缓存是否过期了,代码如下:
function page_cache($ttl = 0) 

{

     $ttl = $ttl ? $ttl : PAGE_TTL;//缓存时间,默认3600s 

     $contents = ob_get_contents();//从缓存中获取内容 

     $contents = "<!--page_ttl:".(time() + $ttl)."-->n".$contents; 

     //加上自定义头部:过期时间=生成时间+缓存时间 

     file_put_contents(PAGE_FILE, $contents);//写入缓存文件中 

     ob_end_flush();//释放缓存 

}

3.函数使用,注意这两个函数有先后执行顺序,还有别忘了ob_start(),代码如下:
<?php 

      page_init();//页面缓存初始化 

      ob_start();//开启缓存         

   

      ...//代码段 

   

      page_cache(60);//一般是最后一行 

   

?>

例2,下面做个示例来说明PHP页面缓存技术,代码如下:
<?php 

$_time =10; 

$dir="D:\php\"; 

 

function cache_start($_time, $dir) 

{ 

  $cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html'; 

  $cachetime = $_time; 

  ob_start(); 

  if(file_exists($cachefile) && (time()-filemtime($cachefile) < $cachetime)) 

  { 

    include($cachefile); 

    ob_end_flush(); 

    exit; 

  } 

} 

 

function cache_end($dir) 

{ 

  $cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html'; 

  $fp = fopen($cachefile, 'w'); 

  fwrite($fp, ob_get_contents()); 

  fclose($fp); 

  ob_end_flush(); 

} 

 

cache_start($_time, $dir); 

//以下是输出的内容,放在cache_start和cache_end两个方法之间 

for ($i=0;$i<5;$i++) 

{ 

  echo $i; 

  sleep(1); 

} 

cache_end($dir); 

?>

例,利用生成文件做缓存,代码如下:
<?php 

ob_start(); 

/** 

* @author 何名慧 

* @copyright 2009-3-13 

* @param string $cache_folder 缓文件夹 

* @param int $cache_create_time 文件缓存时间 

* @example $cache=new Esj_Cache('./_cache',100) 

* @example $cache->read_cache() 读取缓存并输出 

* @example $cache->creatre_cache() 创建缓存文件(放在文件未尾) 

* @example $cache->list_file() 返回所有缓存文件列表 

* @example $cache->del_file() 删除所有缓存文件 

*/ 

 

class Esj_Cache{ 

private $cache_folder=null;//cacher文件夹 

private $wroot_dir=null;//站点目录 

private $cacher_create_time=null;//cacher文件的建立时间 

 

public function __construct($cache_foldername,$cacher_time=100) 

{ 

ob_start(); 

$this->wroot_dir=$_SERVER['DOCUMENT_ROOT']; 

$this->cache_folder=$cache_foldername; 

$this->cacher_create_time=$cacher_time; 

} 

 

public function read_cache() 

{ 

try { 

if(self::create_folder($this->cache_folder)) 

{ 

self::get_cache();//输出缓存文件信息 

}else 

{ 

echo "缓存文件夹创建失败!"; 

return false; 

} 

 

}catch(Exception $e){ 

echo $e; 

return false; 

} 

} 

 

//测试缓存文件夹是否存在 

private function exist_folder($foler) 

{ 

if(file_exists($this->wroot_dir."/".$foler)){ 

return true; 

}else { 

return false; 

} 

} 

 

//建立一个新的文件夹 

private function create_folder($foler) 

{ 

if(!self::exist_folder($foler)) 

{ 

try{ 

mkdir($this->wroot_dir."/".$foler,0777); 

chmod($this->wroot_dir."/".$foler,0777); 

return true; 

}catch (Exception $e) 

{ 

self::get_cache();//输出缓存 

return false; 

} 

return false; 

} 

else 

{ 

return true; 

} 

} 

 

//读取缓存文件 

private function get_cache() 

{ 

$file_name=self::get_filename(); 

if (file_exists($file_name)&&((filemtime($file_name)+$this->cacher_create_time) > time())) 

{ 

$content=file_get_contents($file_name); 

if($content) 

{ 

echo $content; 

ob_end_flush(); 

exit; 

}else 

{ 

echo "文件读取失败"; 

exit; 

 

} 

 

} 

} 

 

//返回文件的名字 

private function get_filename() 

{ 

$filename=$file_name=$this->wroot_dir.'/'.$this->cache_folder.'/'.md5($_SERVER['QUERY_STRING']).".html"; 

return $filename; 

} 

 

//建立缓存文件 

public function create_cache() 

{ 

$filename=self::get_filename(); 

if($filename!="") 

{ 

try{ 

file_put_contents($filename,ob_get_contents()); 

return true; 

}catch (Exception $e) 

{ 

echo "写缓存失败:".$e; 

exit(); 

} 

return true; 

} 

} 

 

// 取得缓存中的所有文件 

public function list_file() 

{ 

$path=$this->cache_folder; 

if ($handle = opendir($path)) { 

while (false !== ($file = readdir($handle))) { 

if($file!="." && $file!="..") { 

$path1=$path."/".$file; 

if(file_exists($path1)) 

{ 

$result[]=$file; 

} 

} 

} 

closedir($handle); 

} 

return $result; 

} 

 

//删除缓存中的所有文件 

public function del_file() 

{ 

$path=$this->cache_folder; 

if ($handle = opendir($path)) { 

while (false !== ($file = readdir($handle))) { 

if($file!="." && $file!="..") { 

$path1=$path."/".$file; 

if(file_exists($path1)) 

{ 

unlink($path1); 

} 

} 

} 

closedir($handle); 

} 

return true; 

} 

 

} 

 

?>

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

PHP 相关文章推荐
php中cookie的作用域
Mar 27 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
php中常用的预定义变量小结
May 09 PHP
php在项目中寻找代码的坏味道(综艺命名)
Jul 19 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
php中异常处理方法小结
Jan 09 #PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 #PHP
php模拟登陆的实现方法分析
Jan 09 #PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 #PHP
php实现读取手机客户端浏览器的类
Jan 09 #PHP
ucenter通信原理分析
Jan 09 #PHP
PHP上传文件时自动分配路径的方法
Jan 09 #PHP
You might like
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php7安装yar扩展的方法详解
2017/08/03 PHP
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
python实现多线程采集的2个代码例子
2014/07/07 Python
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
MySQL面试题目集锦
2016/04/14 面试题
高中军训感言400字
2014/02/24 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
廉洁自律证明
2015/06/24 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
Nginx报404错误的详细解决方法
2022/07/23 Servers