免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2867 | 回复: 1

3个方法解决php页面缓存 [复制链接]

论坛徽章:
0
发表于 2015-05-19 13:11 |显示全部楼层
在php页面缓存首要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),可是更高档的缓存是不运用这些函数的,本文章终究一个完结就有讲到,我们可参考一下。
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 = "n".$contents;
       //加上自定义头部:过期时间=生成时间+缓存时间
     file_put_contents(PAGE_FILE, $contents);//写入缓存文件中
     ob_end_flush();//开释缓存
}
 
3.函数运用,留意这两个函数有先后履行次第,还有别忘了ob_start()
代码如下
拷贝代码

      page_init();//页面缓存初始化
      ob_start();//打开缓存        
  
      ...//代码段
  
      page_cache(60);//通常是终究一行
  
?>
例2
下面做个示例来说明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);
?>

运用生成文件做缓存
代码如下
拷贝代码
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;
}
}
?>
本文来源于来吧程序猿l8chengxuyuan.com

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2015-05-20 11:06 |显示全部楼层
感谢分享,收藏研究一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP