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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
php,不用COM,生成excel文件
Oct 09 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
PHP图片处理之图片旋转和图片翻转实例
Nov 19 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
php-fpm中max_children的配置
Mar 15 PHP
Smarty模板变量与调节器实例详解
Jul 20 PHP
PHP迭代器和生成器用法实例分析
Sep 28 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数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
下载官网python并安装的步骤详解
2019/10/12 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
python实现拼接图片
2020/03/23 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
师范毕业生自我鉴定
2014/01/15 职场文书
大学老师推荐信
2014/02/25 职场文书
人力资源职位说明书
2014/07/29 职场文书
先进个人推荐材料
2014/12/29 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2015年实习单位评语
2015/03/25 职场文书
企业百日安全活动总结
2015/05/07 职场文书
宾馆安全管理制度
2015/08/06 职场文书
Python竟然能剪辑视频
2021/05/25 Python