注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

xiaozhuge0825的博客

 
 
 

日志

 
 

Cache_File——文件缓存类  

2009-10-29 09:08:30|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Cache_File——文件缓存类

发布时间:2009-10-28 22:55   作者: 甲骨文   信息来源: PHPChina 开源社区门户

[i=s] 本帖最后由 甲骨文 于 2009-10-28 23:01 编辑

一时兴起写了这么一个类,大家PP,看看有哪些地方可以改进。

这水平就是我平时工作的水平,收集意见旨在让我能有更大的进步。

CODE:

<?php

//!defined('FIT_IN') && exit('No direct script access allowed');

/**

* @Copyright (C) 2009 http://www.fitphp.com All rights reserved

* @License http://www.apache.org/licenses/LICENSE-2.0

*

* @Name Cache.php

*

* @Version $Revision$

* @Author Hongbin Hsu <Hongbin.Hsu@gmail.com> Initial.

* @Since 2009/10/28

*/

/**/

$cache = Cache::get_instance('file');

$cache->set('kk',$_SERVER,1000000);

print_r($cache->get('kk'));

/**/

class Cache

{

protected static $instance;

protected $lift_time = 900;   //过期时间

protected $cache_dir = 'cache/'; //缓存存放目录

protected $suffix = '.cache.html'; //缓存文件后缀

//----------------------------------------------------------

public static function get_instance($type = '', $policy = array())

    {

       if (!isset(self::$instance)) {

      self::$instance = new self();

     }

  return self::$instance->factory($type, $policy);

    }

   

    //----------------------------------------------------------

   

    protected function Cache(array $policy = null)

    {

     if (!is_null($policy)) {

      foreach($policy as $key => $value){

    $this->$key = $value;

   }

     }

    }

   

    //----------------------------------------------------------

   

    public function factory($type = '', $policy = array())

    {

     if (!empty($type)) {

      $_driver = ucwords(strtolower(trim($type)));

      $_classname = 'Cache_'.$_driver;

      //require_once(FIT_PATH."/Cache/{$_driver}.php");

      if(class_exists($_classname)){

          return new $_classname($policy);

         }

     }

    }

}

class Cache_File extends Cache

{

//----------------------------------------------------------

/**

  * 检查是否存在该文件夹,无则创建

  *

  * @param array $policy

  * @return Cache_File

  */

protected function Cache_File(array $policy = null)

{

  parent::Cache($policy);

  if (!is_dir($this->cache_dir)) {

   @mkdir($this->cache_dir,0777);

  }

}

//----------------------------------------------------------

/**

  * 判断缓存文件是否存在

  *

  * @param string $file

  * @return bool

  */

public function is_exist($file)

{

  if (file_exists($this->cache_dir.'/'.$file.$this->suffix)) {

   return true;

  }else{

   return false;

  }

}

//----------------------------------------------------------

/**

  * 判断缓存文件是否活跃

  *

  * @param string $file

  * @return bool

  */

public function is_active($file)

{

  if ($this->is_exist($file) || (time()- $this->last_modiffy($file) < $this->lift_time)) {

   return true;

  }else{

   return false;

  }

}

//----------------------------------------------------------

/**

  * 写入缓存

  *

  * @param string $file

  * @param mixed $data

  * @param int $lift_time

  */

public function set($file, $data, $lift_time = null)

{

  $lift_time = $lift_time ? $lift_time : $this->lift_time;

  $file = $this->cache_dir.'/'.$file.$this->suffix;

  $data = serialize($data);

  @file_put_contents($file,$data);

  @chmod($file,0777);

  @touch($file,time()+$lift_time);

}

//----------------------------------------------------------

/**

  * 读取缓存,读取失败或缓存失效返回false

  *

  */

public function get($file)

{

  $file = $this->cache_dir.'/'.$file.$this->suffix;

  if (@filemtime($file) >= time()) {

   return unserialize(file_get_contents($file));

  }else{

   @unlink($file);

  }

}

//----------------------------------------------------------

/**

  * 移除指定缓存

  *

  */

public function remove($file)

{

  if (@unlink($this->cache_dir.'/'.$file.$this->suffix)) {

   return true;

  }else{

   return false;

  }

}

//----------------------------------------------------------

/**

  * 清空过期缓存文件

  *

  */

public function clear()

{

  $files = scandir($this->cache_dir);

  foreach ($files as $file) {

   if (!$this->is_active($file)) {

    @unlink($this->cache_dir.'/'.$file.$this->suffix);

   }

  }

}

//----------------------------------------------------------

/**

  * 请空所有缓存文件

  *

  */

public function clear_all()

{

  $files = scandir($this->cache_dir);

  foreach ($files as $file){

   @unlink($this->cache_dir.'/'.$file.$this->suffix);

  }

}

//----------------------------------------------------------

/**

  * 返回上次修改时间

  *

  * @param string $file

  * @return datetime

  */

private function last_modiffy($file)

{

  return filemtime($this->cache_dir.'/'.$file.$this->suffix);

}

}

最新回复

willko at 2009-10-28 23:27:20

1.滥用单件模式

2.用策略模式比用工厂模式好

willko at 2009-10-28 23:32:34

[i=s] 本帖最后由 willko 于 2009-10-28 23:34 编辑

贴下我写的部分代码,仅供参考:)。

不过根据经验,这种封装只是一致了调用接口,对于不同的后端,特性不一样,统一了接口反而不利于灵活性。

[php]

<?php

// +----------------------------------------------------------------------+

// | Willko Framework                                                     |

// +----------------------------------------------------------------------+

// | Copyright (c) 2008-2009 Willko Cheng                                 |

// +----------------------------------------------------------------------+

// | Authors: Willko Cheng <willko@foxmail.com>                           |

// +----------------------------------------------------------------------+

class Cache {

        private $_frontEnd;

        private $_backEnd;

        public function __construct($backend = 'file', $frontend = 'core', $backendOptions = array(), $frontendOptions = array()) {

                $this->_frontEnd = $this->_factoryFrontEnd($frontend, $frontendOptions);

                $this->_backEnd = $this->_factoryBackEnd($backend, $backendOptions);

        }

       

        public function set($key, $data = '', $life = 0) {

                return $this->_backEnd->set($key, $this->_frontEnd->set($data), $life);

        }

       

        public function get($key) {

                return $this->_frontEnd->get($this->_backEnd->get($key));

        }

       

        public function delete($key) {

                return $this->_backEnd->delete($key);

        }

       

        public function call($method, $isBackend = true) {

                $method = "on$method";

                $attr = $isBackend ? '_backEnd' : '_frontEnd';

                $args = func_get_args();

               

                return call_user_func_array(array($this->$attr, $method), array_slice($args, 2));

        }

       

        private function _factoryFrontEnd($class, $frontendOptions) {

                return Factory::getClass($class, 'lib/Cache', $frontendOptions);

        }

       

        private function _factoryBackEnd($class, $backendOptions) {

                return Factory::getClass($class, 'lib/Cache', $backendOptions);

        }

}

// Front End

interface Cache_FrontEnd {

        public function set($data);

        public function get($data);

}

// Back End

interface Cache_BackEnd {

        public function __construct($options);

        public function get($key);

//        public function add($key, $data, $life = 0);

//        public function replace($key, $data, $life = 0);

        public function set($key, $data, $life = 0);

        public function delete($key);

}

[/php]

用法:

[php]

<?php

$cache = Factory::getClass('Cache', 'lib', 'File', 'Output', array());

$ret = $cache->get($key);       

$cache->set($key, '', 10);

[/php]

  评论这张
 
阅读(98)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018