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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
基于mysql的论坛(6)
Oct 09 PHP
解析ajax事件的调用顺序
Jun 17 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
Apr 19 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
php DES加密算法实例分析
Sep 18 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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
php中static静态变量的使用方法详解
2010/06/04 PHP
zend api扩展的php对象的autoload工具
2011/04/18 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
ionic 自定义弹框效果
2017/06/27 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
python分割文件的常用方法
2014/11/01 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python定时任务sched模块用法示例
2018/07/16 Python
基于Python函数和变量名解析
2019/07/19 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
应用艺术专业个人的自我评价
2014/01/03 职场文书
年度评优评先方案
2014/06/03 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
儿子满月酒致辞
2015/07/29 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
django 认证类配置实现
2021/11/11 Python