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 相关文章推荐
dedecms系统常用术语汇总
Apr 03 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php牛逼的面试题分享
Jan 18 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
php 启动报错如何解决
Jan 17 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
PHP使用逆波兰式计算工资的方法
Jul 29 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
PHP微信支付实例解析
Jul 22 PHP
php链式操作的实现方式分析
Aug 12 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
phpquery中文手册
Mar 18 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
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
PDO::prepare讲解
2019/01/29 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
jQuery实现日历效果
2020/09/11 jQuery
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python实现的科学计算器功能示例
2017/08/04 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Django添加sitemap的方法示例
2018/08/06 Python
django使用LDAP验证的方法示例
2018/12/10 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
python 表格打印代码实例解析
2019/10/12 Python
python进度条显示之tqmd模块
2020/08/22 Python
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
博士生求职信
2014/07/06 职场文书
班级出游活动计划书
2014/08/15 职场文书
先进员工事迹材料
2014/12/20 职场文书
员工升职自荐信
2015/03/27 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
python热力图实现的完整实例
2022/06/25 Python