网站地图    收藏   

主页 > php专栏 > php应用 >

php文件缓存类实例整理 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] 缓存类是我们开发应用中会常用使用到的功能,下面我来给大家整理几个php文件缓存类了,各个文件缓存类写法不同,但在性能上会有区别,有兴趣测试的朋友可测试一下这些缓存类吧.例1,代...

php文件缓存类实例整理

缓存类是我们开发应用中会常用使用到的功能,下面我来给大家整理几个php文件缓存类了,各个文件缓存类写法不同,但在性能上会有区别,有兴趣测试的朋友可测试一下这些缓存类吧.

例1,代码如下:

  1. <?php 
  2. $fzz = new fzz_cache; 
  3. $fzz->kk = $_SERVER//写入缓存 
  4. //$fzz->set("kk",$_SERVER,10000); //此方法不与类属性想冲突,可以用任意缓存名; 
  5. print_r($fzz->kk);  //读取缓存 
  6. //print_r($fzz->get("kk")); 
  7. //unset($fzz->kk); //删除缓存 
  8. //$fzz->_unset("kk"); 
  9. var_dump(isset($fzz->kk)); //判断缓存是否存在 
  10. //$fzz->_isset("kk"); 
  11. //$fzz->clear(); //清理过期缓存 
  12. //$fzz->clear_all(); //清理所有缓存文件 
  13. class fzz_cache{ 
  14.  public $limit_time = 20000; //缓存过期时间 
  15.  public $cache_dir = "data"//缓存文件保存目录 
  16.  
  17.  //写入缓存 
  18.  function __set($key , $val){ 
  19.   $this->_set($key ,$val); 
  20.  } 
  21.  //第三个参数为过期时间 
  22.  function _set($key ,$val,$limit_time=null){   
  23.   $limit_time = $limit_time ? $limit_time : $this->limit_time; 
  24.   $file = $this->cache_dir."/".$key.".cache"
  25.   $val = serialize($val); 
  26.   @file_put_contents($file,$valor $this->error(__line__,"fail to write in file"); 
  27.   @chmod($file,0777); 
  28.   @touch($file,time()+$limit_timeor $this->error(__line__,"fail to change time"); 
  29.  } 
  30.  
  31.  
  32.  //读取缓存 
  33.  function __get($key){ 
  34.   return $this->_get($key); 
  35.  } 
  36.  function _get($key){ 
  37.   $file = $this->cache_dir."/".$key.".cache"
  38.   if (@filemtime($file)>=time()){ 
  39.    return unserialize(file_get_contents($file)); 
  40.   }else
  41.    @unlink($fileor $this->error(__line__,"fail to unlink"); 
  42.    return false; 
  43.   } 
  44.  } 
  45.  
  46.  
  47.  //删除缓存文件 
  48.  function __unset($key){ 
  49.   return $this->_unset($key); 
  50.  } 
  51.  function _unset($key){ 
  52.   if (@unlink($this->cache_dir."/".$key.".cache")){ 
  53.    return true; 
  54.   }else
  55.    return false; 
  56.   } 
  57.  } 
  58.  
  59.  
  60.  //检查缓存是否存在,过期则认为不存在 
  61.  function __isset($key){ 
  62.   return $this->_isset($key); 
  63.  } 
  64.  function _isset($key){ 
  65.   $file = $this->cache_dir."/".$key.".cache"
  66.   if (@filemtime($file)>=time()){ 
  67.    return true; 
  68.   }else
  69.    @unlink($file) ; 
  70.    return false; 
  71.   } 
  72.  } 
  73.  
  74.  
  75.  //清除过期缓存文件 
  76.  function clear(){ 
  77.   $files = scandir($this->cache_dir); 
  78.   foreach ($files as $val){ 
  79.    if (filemtime($this->cache_dir."/".$val)<time()){ 
  80.     @unlink($this->cache_dir."/".$val); 
  81.    } 
  82.   } 
  83.  } 
  84.  
  85.  
  86.  //清除所有缓存文件 
  87.  function clear_all(){ 
  88.   $files = scandir($this->cache_dir); 
  89.   foreach ($files as $val){ 
  90.    @unlink($this->cache_dir."/".$val); 
  91.   } 
  92.  } 
  93.  
  94.  function error($msg,$debug = false) { 
  95.   $err = new Exception($msg); 
  96.   $str = "<pre> 
  97. <span style='color:red'>error:</span> 
  98. ".print_r($err->getTrace(),1)." 
  99. </pre>";//开源代码phpfensi.com 
  100.   if($debug == true) { 
  101.    file_put_contents(date('Y-m-d H_i_s').".log",$str); 
  102.    return $str
  103.   }else
  104.    die($str); 
  105.   } 
  106.  } 
  107. ?> 

例2.从CI社区的stblog和CI的file_helper类中提取出来的php文件缓存类,一个简单的基于文件的key->value缓存类。

这个类可以用来缓存一些基本信息,比如博客的header,footer,sidebar中的一些不经常变化,从数据库中取出的内容,取数据前先判断文件缓存中的内容是否过期,如果没过期取出来,过期了则连接数据库查询,并将结果重新写入文件缓存,更新过期时间。跟memcache使用类似,不过更方便。用在一些小的应用上足够了...代码如下:

  1. <?php 
  2. define('DIRECTORY_SEPARATOR','/'); 
  3. define('FOPEN_WRITE_CREATE_DESTRUCTIVE','wb'); 
  4. define('FOPEN_WRITE_CREATE','ab'); 
  5. define('DIR_WRITE_MODE', 0777); 
  6. class FileCache { 
  7.  
  8.  /** 
  9.      * 缓存路径 
  10.      * 
  11.      * @access private 
  12.      * @var string 
  13.      */ 
  14.  private $_cache_path
  15.  
  16.  /** 
  17.      * 缓存过期时间,单位是秒second 
  18.      * 
  19.      * @access private 
  20.      * @var int 
  21.      */ 
  22.  private $_cache_expire
  23.  
  24.  /** 
  25.      * 解析函数,设置缓存过期实践和存储路径 
  26.      *  
  27.      * @access public 
  28.      * @return void 
  29.      */ 
  30.  public function __construct($expire$cache_path
  31.  { 
  32.   $this->_cache_expire = $expire
  33.   $this->_cache_path = $cache_path
  34.  } 
  35.  
  36.  /** 
  37.      * 缓存文件名 
  38.      *  
  39.      * @access public 
  40.      * @param  string $key 
  41.      * @return void 
  42.      */ 
  43.  private function _file($key
  44.  { 
  45.   return $this->_cache_path . md5($key); 
  46.  } 
  47.  
  48.  /** 
  49.      * 设置缓存 
  50.      *  
  51.      * @access public 
  52.      * @param  string $key 缓存的唯一键 
  53.      * @param  string $data 缓存的内容 
  54.      * @return bool 
  55.      */ 
  56.  public function set($key$data
  57.  { 
  58.   $value = serialize($data); 
  59.    
  60.   $file = $this->_file($key); 
  61.    
  62.      return $this->write_file($file$value); 
  63.  } 
  64.  
  65.  /** 
  66.      * 获取缓存 
  67.      *  
  68.      * @access public 
  69.      * @param  string $key 缓存的唯一键 
  70.      * @return mixed 
  71.      */ 
  72.  public function get($key
  73.  { 
  74.   $file = $this->_file($key); 
  75.    
  76.   /** 文件不存在或目录不可写 */ 
  77.   if (!file_exists($file) || !$this->is_really_writable($file)) 
  78.   { 
  79.    return false; 
  80.   } 
  81.    
  82.   /** 缓存没有过期,仍然可用 */ 
  83.   if ( time() < (filemtime($file) + $this->_cache_expire) )  
  84.   { 
  85.     
  86.    $data = $this->read_file($file); 
  87.     
  88.    if(FALSE !== $data
  89.    { 
  90.     return unserialize($data); 
  91.    } 
  92.     
  93.    return FALSE; 
  94.   } 
  95.    
  96.   /** 缓存过期,删除之 */ 
  97.   @unlink($file); 
  98.   return FALSE; 
  99.   } 
  100.    
  101.   function read_file($file
  102.  { 
  103.   if ( ! file_exists($file)) 
  104.   { 
  105.    return FALSE; 
  106.   } 
  107.  
  108.   if (function_exists('file_get_contents')) 
  109.   { 
  110.    return file_get_contents($file);   
  111.   } 
  112.  
  113.   if ( ! $fp = @fopen($file, FOPEN_READ)) 
  114.   { 
  115.    return FALSE; 
  116.   } 
  117.    
  118.   flock($fp, LOCK_SH);//读取之前加上共享锁 
  119.  
  120.   $data = ''
  121.   if (filesize($file) > 0) 
  122.   { 
  123.    $data =& fread($fpfilesize($file)); 
  124.   } 
  125.  
  126.   flock($fp, LOCK_UN);//释放锁 
  127.   fclose($fp); 
  128.  
  129.   return $data
  130.  } 
  131.  
  132.   function write_file($path$data$mode = FOPEN_WRITE_CREATE_DESTRUCTIVE) 
  133.  { 
  134.   if ( ! $fp = @fopen($path$mode)) 
  135.   { 
  136.    return FALSE; 
  137.   } 
  138.    
  139.   flock($fp, LOCK_EX); 
  140.   fwrite($fp$data); 
  141.   flock($fp, LOCK_UN); 
  142.   fclose($fp);  
  143.  
  144.   return TRUE; 
  145.  } 
  146.  function is_really_writable($file)//兼容各平台判断文件是否有写入权限 
  147.  {  
  148.   // If we're on a Unix server with safe_mode off we call is_writable 
  149.   if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) 
  150.   { 
  151.    return is_writable($file); 
  152.   } 
  153.  
  154.   // For windows servers and safe_mode "on" installations we'll actually 
  155.   // write a file then read it.  Bah... 
  156.   if (is_dir($file)) 
  157.   { 
  158.    $file = rtrim($file'/').'/'.md5(rand(1,100)); 
  159.  
  160.    if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) 
  161.    { 
  162.     return FALSE; 
  163.    } 
  164.  
  165.    fclose($fp); 
  166.    @chmod($file, DIR_WRITE_MODE); 
  167.    @unlink($file); 
  168.    return TRUE; 
  169.   } 
  170.   elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) 
  171.   {//开源代码phpfensi.com 
  172.    return FALSE; 
  173.   } 
  174.  
  175.   fclose($fp); 
  176.   return TRUE; 
  177.  } 
  178. $cache = new FileCache(30,'cache/'); 
  179. $cache->set('test','this is a test.'); 
  180. print $cache->get('test'); 
  181. /* End of file FlieCache.php */ 
  182. ?> 

例3.自己觉得很好用的php文件缓存,代码如下:

  1. <?php  
  2. class cache 
  3. {  
  4.  private static $_instance = null; 
  5.  
  6.     protected $_options = array
  7.         'cache_dir'        => "./"
  8.         'file_name_prefix' => 'cache'
  9.      'mode'            => '1'//mode 1 为serialize model 2为保存为可执行文件 
  10.     );  
  11.  
  12.  /** 
  13.   * 得到本类实例 
  14.   *  
  15.   * @return Ambiguous 
  16.   */ 
  17.  public static function getInstance() 
  18.  { 
  19.   if(self::$_instance === null) 
  20.   { 
  21.    self::$_instance = new self(); 
  22.   } 
  23.   return self::$_instance
  24.  }  
  25.  
  26.  /** 
  27.   * 得到缓存信息 
  28.   *  
  29.   * @param string $id 
  30.   * @return boolean|array 
  31.   */ 
  32.  public static function get($id
  33.  { 
  34.   $instance = self::getInstance(); 
  35.    
  36.   //缓存文件不存在 
  37.   if(!$instance->has($id)) 
  38.   { 
  39.    return false; 
  40.   } 
  41.    
  42.   $file = $instance->_file($id); 
  43.    
  44.   $data = $instance->_fileGetContents($file); 
  45.    
  46.   if($data['expire'] == 0 || time() < $data['expire']) 
  47.   { 
  48.    return $data['contents']; 
  49.   } 
  50.   return false; 
  51.  } 
  52.  
  53.  /** 
  54.   * 设置一个缓存 
  55.   *  
  56.   * @param string $id   缓存id 
  57.   * @param array  $data 缓存内容 
  58.   * @param int    $cacheLife 缓存生命 默认为0无限生命 
  59.   */ 
  60.  public static function set($id$data$cacheLife = 0) 
  61.  { 
  62.   $instance = self::getInstance(); 
  63.    
  64.   $time = time(); 
  65.   $cache      = array(); 
  66.   $cache['contents'] = $data
  67.   $cache['expire']   = $cacheLife === 0 ? 0 : $time + $cacheLife
  68.   $cache['mtime']    = $time
  69.    
  70.   $file = $instance->_file($id); 
  71.    
  72.   return $instance->_filePutContents($file$cache); 
  73.  } 
  74.  
  75.     /** 
  76.      * 清除一条缓存 
  77.      *  
  78.      * @param string cache id   
  79.      * @return void 
  80.      */    
  81.  public static function delete($id
  82.  { 
  83.   $instance = self::getInstance(); 
  84.    
  85.   if(!$instance->has($id)) 
  86.   { 
  87.    return false; 
  88.   } 
  89.      $file = $instance->_file($id); 
  90.      //删除该缓存 
  91.      return unlink($file); 
  92.  } 
  93.  
  94.  /** 
  95.   * 判断缓存是否存在 
  96.   *  
  97.   * @param string $id cache_id 
  98.   * @return boolean true 缓存存在 false 缓存不存在 
  99.   */ 
  100.  public static function has($id
  101.  { 
  102.   $instance = self::getInstance(); 
  103.   $file     = $instance->_file($id); 
  104.    
  105.   if(!is_file($file)) 
  106.   { 
  107.    return false; 
  108.   } 
  109.   return true; 
  110.  } 
  111.  
  112.  /** 
  113.   * 通过缓存id得到缓存信息路径 
  114.   * @param string $id 
  115.   * @return string 缓存文件路径 
  116.   */ 
  117.  protected function _file($id
  118.  { 
  119.   $instance  = self::getInstance(); 
  120.   $fileNmae  = $instance->_idToFileName($id); 
  121.   return $instance->_options['cache_dir'] . $fileNmae
  122.  }  
  123.  
  124.  /** 
  125.   * 通过id得到缓存信息存储文件名 
  126.   *  
  127.   * @param  $id 
  128.   * @return string 缓存文件名 
  129.   */ 
  130.  protected function _idToFileName($id
  131.  { 
  132.   $instance  = self::getInstance(); 
  133.   $prefix    = $instance->_options['file_name_prefix']; 
  134.   return $prefix . '---' . $id
  135.  } 
  136.  
  137.  /** 
  138.   * 通过filename得到缓存id 
  139.   *  
  140.   * @param  $id 
  141.   * @return string 缓存id 
  142.   */ 
  143.  protected function _fileNameToId($fileName
  144.  { 
  145.   $instance  = self::getInstance(); 
  146.   $prefix    = $instance->_options['file_name_prefix']; 
  147.   return preg_replace('/^' . $prefix . '---(.*)$/''$1'$fileName); 
  148.  } 
  149.  
  150.  /** 
  151.   * 把数据写入文件 
  152.   *  
  153.   * @param string $file 文件名称 
  154.   * @param array  $contents 数据内容 
  155.   * @return bool  
  156.   */ 
  157.  protected function _filePutContents($file$contents
  158.  { 
  159.   if($this->_options['mode'] == 1) 
  160.   { 
  161.    $contents = serialize($contents); 
  162.   } 
  163.   else  
  164.   { 
  165.    $time = time();  
  166.          $contents = "<?phpn"
  167.                  " // mktime: "$time"n"
  168.                  " return "
  169.                  var_export($contents, true). 
  170.                  "n?>"
  171.   } 
  172.    
  173.   $result = false; 
  174.      $f = @fopen($file'w'); 
  175.         if ($f) { 
  176.             @flo

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论