• 文件缓存数据类
    时间:2009-01-11   作者:佚名   出处:互联网

       1. /**
       2.  * 文件缓存类
       3.  *
       4.  * @copyright Copyright (c) 2006 - 2008 MYRIS.CN
       5.  * @author 志凡 <dzjzmj@gmail.com>
       6.  * @package cache
       7.  * @version v0.1
       8.  */ 
       9. class FileCache { 
      10.     /**
      11.      * @var string $cachePath 缓存文件目录
      12.      * @access public
      13.      */ 
      14.     public $cachePath = './'; 
      15.      
      16.     /**
      17.      * 构造函数
      18.      * @param string $path 缓存文件目录
      19.      */ 
      20.     function __construct($path = NULL) { 
      21.         if ($path) { 
      22.             $this->cachePath = $path; 
      23.         } 
      24.          
      25.          
      26.     } 
      27.      
      28.     /**
      29.      * 析构函数
      30.      */ 
      31.     function __destruct() { 
      32.         //nothing 
      33.     } 
      34.      
      35.     /**
      36.      * 在cache中设置键为$key的项的值,如果该项不存在,则新建一个项
      37.      * @param string $key 键值
      38.      * @param mix $var 值
      39.      * @param int $expire 到期秒数
      40.      * @param int $flag 标志位
      41.      * @return bool 如果成功则返回 TRUE,失败则返回 FALSE。
      42.      * @access public
      43.      */ 
      44.     public function set($key, $var, $expire = 36000, $flag = 0) { 
      45.         $value = serialize($var); 
      46.         $timeout = time() + $expire; 
      47.         $result = safe_file_put_contents($this->cachePath . urlencode($key) .'.cache', 
      48.                 $timeout . '<<%-==-%>>' . $value); 
      49.         return $result; 
      50.     } 
      51.      
      52.     /**
      53.      * 在cache中获取键为$key的项的值
      54.      * @param string $key 键值
      55.      * @return string 如果该项不存在,则返回false
      56.      * @access public
      57.      */ 
      58.     public function get($key) { 
      59.         $file = $this->cachePath . urlencode($key) .'.cache'; 
      60.         if (file_exists($file)) { 
      61.             $content = safe_file_get_contents($file); 
      62.             if ($content===false) { 
      63.                 return false; 
      64.             } 
      65.             $tmp = explode('<<%-==-%>>', $content); 
      66.             $timeout = $tmp[0]; 
      67.             $value = $tmp[1]; 
      68.             if (time()>$timeout) { 
      69.                 $result = false; 
      70.             } else { 
      71.                 $result = unserialize($value); 
      72.             } 
      73.         } else { 
      74.             $result = false; 
      75.         } 
      76.         return $result; 
      77.     } 
      78.      
      79.     /**
      80.      * 清空cache中所有项
      81.      * @return 如果成功则返回 TRUE,失败则返回 FALSE。
      82.      * @access public
      83.      */ 
      84.     public function flush() { 
      85.         $fileList = FileSystem::ls($this->cachePath,array(),'asc',true); 
      86.         return FileSystem::rm($fileList); 
      87.     } 
      88.      
      89.     /**
      90.      * 删除在cache中键为$key的项的值
      91.      * @param string $key 键值
      92.      * @return 如果成功则返回 TRUE,失败则返回 FALSE。
      93.      * @access public
      94.      */ 
      95.     public function delete($key) { 
      96.         return FileSystem::rm($this->cachePath . $key .'.cache'); 
      97.     } 
      98. } 
      99.  
     100. if (!function_exists('safe_file_put_contents')) { 
     101.     function safe_file_put_contents($filename, $content) 
     102.     { 
     103.         $fp = fopen($filename, 'wb'); 
     104.         if ($fp) { 
     105.             flock($fp, LOCK_EX); 
     106.             fwrite($fp, $content); 
     107.             flock($fp, LOCK_UN); 
     108.             fclose($fp); 
     109.             return true; 
     110.         } else { 
     111.             return false; 
     112.         } 
     113.     } 
     114. } 
     115.  
     116. if (!function_exists('safe_file_get_contents')) { 
     117.     function safe_file_get_contents($filename) 
     118.     { 
     119.         $fp = fopen($filename, 'rb'); 
     120.         if ($fp) { 
     121.             flock($fp, LOCK_SH); 
     122.             clearstatcache(); 
     123.             $filesize = filesize($filename); 
     124.             if ($filesize > 0) { 
     125.                 $data = fread($fp, $filesize); 
     126.             } 
     127.             flock($fp, LOCK_UN); 
     128.             fclose($fp); 
     129.             return $data; 
     130.         } else { 
     131.             return false; 
     132.         } 
     133.     } 
     134. } 
     135.  
     136.  
     137. //例子 
     138. $cache = new FileCache(); 
     139. $data = $cache->get('yourkey');//yourkey是你为每一个要缓存的数据定义的缓存名字 
     140. if ($data===false) { 
     141.     $data = '从数据库取出的数据或很复杂很耗时的弄出来的数据'; 
     142.     $cache->set('yourkey',$data,3600);//缓存3600秒 
     143. }


    看代码

    例子解释

    一开始你从缓存中取数据(get)如果数据有缓存就直接使用缓存中的数据了。

    如果缓存过期或没有,那重新取数据(数据库或其它),然后保存到缓存中。再使用你的数据。


    我们可以这样想,这个页面第一次被访问的时候,是取不到缓存数据的所以$data是false,这时按正常逻辑取数据。

    过几份种再访问,这时你从缓存中可以取到数据,直接使用,跳过逻辑取数据。这样就省了很多时间哟。

    过了1小时几份钟你再访问,这时候缓存过期了,返回false,那么重新取一次再缓存。

    这样一直反复。可以看取,1小时才会逻辑取一次数据。这样就达到了缓存的目的。

    网友留言/评论

    我要留言/评论