包含 缓存 标签的文章

PHP缓存类更新

缓存真的是个好东西,好玩又有趣.

PHP代码
  1. <?php   
  2. /*  
  3.     常量 CACHE_DIR 定义缓存文件所在目录  
  4. */  
  5.   
  6. define('CACHE_DIR','/data/cache');   
  7.   
  8. class cache {   
  9.     var $cache = array();   
  10.            
  11.     //获取缓存   
  12.     function getCache($cacheName) {   
  13.         if(!array_key_exists($cacheName,$this->cache)) {   
  14.             include $this->cacheFile($cacheName);   
  15.             $this->cache[$cacheName] = $cache[$cacheName];   
  16.         }   
  17.         return $this->cache[$cacheName];   
  18.     }   
  19.   
  20.     //存储缓存   
  21.     function saveCache($cacheName,$cacheVar){   
  22.         $cacheCode = "<?php\r\n//Cache create at ".date('Y-m-d H:i:s')."\r\n";   
  23.         $cacheCode .= '$cache[\''.$cacheName.'\'] = ';   
  24.         $cacheCode .= $this->createVarCode($cacheVar);   
  25.         $cacheCode .= ";\r\n";   
  26.         return $this->writeFile($this->cacheFile($cacheName),$cacheCode) ? true : false;   
  27.     }   
  28.   
  29.     //创建缓存变量原生态代码   
  30.     function createVarCode($myVar,$level=0) {   
  31.         $tabEnd = '';   
  32.         for($i=0;$i<$level;$i++) {   
  33.             $tabEnd .= "\t";   
  34.         }   
  35.         $tab = $tabEnd."\t";   
  36.         if(is_array($myVar)) {   
  37.             $varCode = "array(\r\n";   
  38.             foreach($myVar as $key => $val) {   
  39.                 $key = is_numeric($key) ? $key : '\''.$key.'\'';   
  40.                 if(is_array($val)) {   
  41.                     $varCode .= $tab.$key.' => '.$this->createVarCode($val,$level + 1);   
  42.                 } else {   
  43.                     $varCode .= $tab.$key.' => \''.$this->addslashes($val).'\'';   
  44.                 }   
  45.                 $varCode .= ",\r\n";   
  46.             }   
  47.             if($myVar) {   
  48.                 $varCode = substr_replace($varCode,'',-3,1)."$tabEnd)";   
  49.             }   
  50.         } else {   
  51.             $varCode = '\''.$this->addslashes($myVar).'\'';   
  52.         }   
  53.         return $varCode;   
  54.     }   
  55.        
  56.     function addslashes($text) {   
  57.         $text = addcslashes($text,'\\');  
  58.         $text = addcslashes($text,'\'');   
  59.         return $text;   
  60.     }   
  61.   
  62.     //返回缓存文件地址   
  63.     function cacheFile($cacheName) {   
  64.         $cacheFile = CACHE_DIR.'/'.$cacheName.'.php';   
  65.         return $cacheFile;   
  66.     }   
  67.   
  68.     //判断缓存文件是否存在   
  69.     function cacheExists($cacheName) {   
  70.         $state = file_exists($this->cacheFile($cacheName));   
  71.         return $state;   
  72.     }   
  73.        
  74.     function deleteCache($cacheName) {   
  75.         return @unlink($this->cacheFile($cacheName)) ? true : false;   
  76.     }   
  77.   
  78.     function printCache() {   
  79.         print_r($this->cache);   
  80.     }   
  81.   
  82.     //写文件   
  83.     function writeFile($fileName,$content,$wmode='w'){   
  84.         $s = false;   
  85.         if($fp = @fopen($fileName,$wmode)) {   
  86.             if(flock($fp,LOCK_EX)) {   
  87.                 $s = @fwrite($fp,$content) ? true : false;    
  88.                 flock($fp,LOCK_UN);   
  89.                 fclose($fp);   
  90.             }   
  91.         }   
  92.         return $s;   
  93.     }   
  94. }   

加上这个函数

PHP代码
  1. //从缓存获取并处理   
  2. function GetCache($cacheName,$func='') {   
  3.     global $cache;   
  4.     !defined('CACHE_FUNC') && require_once API('cache_function');   
  5.     if($cache->cacheExists($cacheName)) {   
  6.         $thisCache = $cache->getCache($cacheName);   
  7.     } elseif($func) {   
  8.         eval($func.'();');   
  9.         exit('缓存 <b>'.$cacheName.'</b> 未能找到,系统已经更新,请刷新页面!');   
  10.     }   
  11.     return $thisCache;   
  12. }  

这样子调用

PHP代码
  1. $settings = GetCache('settings','cache_reload_settings');  //从缓存获取设置  

我们先定义了一个函灵敏 cache_reload_settings() ,这样 GetCache  函数会先从缓存获取,没有的话就会调用 cache_reload_settings() 函数更新缓存,其实PHP的 var_export 函数让我很郁闷.

Look:

PHP代码
  1. /*  
  2.     缓存更新函数模块  
  3.     14:25 2009-4-20  
  4. */  
  5. define('CACHE_FUNC',true);   
  6.   
  7. if(!defined('CACHE_DIR')) {   
  8.     require_once API('cache');   
  9. }   
  10.   
  11. if(!$cache) {   
  12.     $cache = new cache;   
  13. }   
  14.   
  15. function cache_reload_settings() {   
  16.     global $db,$cache;   
  17.     $settings = array();   
  18.     $result = $db->query("SELECT * FROM hl_settings");   
  19.     while($row = $db->fetchArray($result)) {   
  20.         $settings[$row['n']] = $row['v'];   
  21.     }   
  22.     $cache->saveCache('settings',$settings);   
  23. }  

PHP强制浏览器缓存文件以加速浏览

我们通常都会想让浏览器不要缓存PHP的输出以保持更新,以下就是强制不缓存:

PHP代码
  1. header("Cache-Control: no-cache, must-revalidate");   
  2. header("Pragma: no-cache");  

今天在修改我的 OneExplorer 的时候,因为图标都是以 base64 编码嵌入在PHP文件中然后解码输出,所以如果能够把同样的输出强制缓存起来,便可以从很大程度上的提高访问速度并且减轻服务器负担。发现网上关于强制缓存的讨论很少,大都是强制不缓存,看下面的代码:

PHP代码
  1. header("Cache-Control: public");   
  2. header("Pragma: cache");   
  3. $offset = 60*60*24;  //强制缓一天   
  4. $ExpStr = "Expires: ".gmdate("D, d M Y H:i:s", time() + $offset)." GMT";   
  5. header($ExpStr);  

这样我们就可以强制把输出缓存一天,只要浏览的地址不变,就会一直从缓存读取。
[attach=151]
浏览器的临时文件夹,仔细看 截止期限 上次检查时间

今日写完的缓存类

 尚未完善,大家共同研究

PHP代码
  1. <?php         
  2. /*        
  3.   缓存类 of www.vgot.cn by pader        
  4.   09-1-30 13:34        
  5. */          
  6.       
  7. define('CACHE_DIR',dirname(__FILE__).'/cache');      
  8.   
  9. class cache {   
  10.     var $cache = array();   
  11.        
  12.     //获取缓存   
  13.     function getCache($cacheName) {   
  14.         include $this->cacheFile($cacheName);   
  15.         $this->cache[$cacheName] = $cache[$cacheName];   
  16.         return $this->cache[$cacheName];   
  17.     }   
  18.   
  19.     //存储缓存   
  20.     function saveCache($cacheName,$cacheVar){   
  21.         $cacheCode = "<?php\r\n//Cache create at ".date('Y-m-d H:i:s')."\r\n";   
  22.         $cacheCode .= '$cache[\''.$cacheName.'\'] = ';   
  23.         $cacheCode .= $this->createVarCode($cacheVar);   
  24.         $cacheCode .= ";\r\n";   
  25.         return $this->writeFile($this->cacheFile($cacheName),$cacheCode) ? true : false;   
  26.     }   
  27.   
  28.     //创建缓存变量原生态代码   
  29.     function createVarCode($myVar,$level=0) {   
  30.         $tabEnd = '';   
  31.         for($i=0;$i<$level;$i++) {   
  32.             $tabEnd .= "\t";   
  33.         }   
  34.         $tab = $tabEnd."\t";   
  35.         if(is_array($myVar)) {   
  36.             $varCode = "array(\r\n";   
  37.             foreach($myVar as $key => $val) {   
  38.                 $key = is_numeric($key) ? $key : '\''.$key.'\'';   
  39.                 if(is_array($val)) {   
  40.                     $varCode .= $tab.$key.' => '.$this->createVarCode($val,$level + 1);   
  41.                 } else {   
  42.                     $varCode .= $tab.$key.' => \''.$this->addslashes($val).'\'';   
  43.                 }   
  44.                 $varCode .= ",\r\n";   
  45.             }   
  46.             $varCode = substr_replace($varCode,'',-3,1)."$tabEnd)";   
  47.         } else {   
  48.             $varCode = '\''.$this->addslashes($myVar).'\'';   
  49.         }   
  50.         return $varCode;   
  51.     }   
  52.        
  53.     function addslashes($text) {   
  54.         $text = addcslashes($text,'\\');  
  55.         $text = addcslashes($text,'\'');   
  56.         return $text;   
  57.     }   
  58.   
  59.     //返回缓存文件地址   
  60.     function cacheFile($cacheName) {   
  61.         $cacheFile = CACHE_DIR.'/'.$cacheName.'.php';   
  62.         return $cacheFile;   
  63.     }   
  64.   
  65.     function deleteCache($cacheName) {   
  66.         return @unlink($this->cacheFile($cacheName)) ? true : false;   
  67.     }   
  68.   
  69.     function printCache() {   
  70.         print_r($this->cache);   
  71.     }   
  72.   
  73.     //写文件   
  74.     function writeFile($fileName,$content,$wmode='w'){   
  75.         $s = false;   
  76.         if($fp = @fopen($fileName,$wmode)) {   
  77.             if(flock($fp,LOCK_EX)) {   
  78.                 $s = @fwrite($fp,$content) ? true : false;    
  79.                 flock($fp,LOCK_UN);   
  80.                 fclose($fp);   
  81.             }   
  82.         }   
  83.         return $s;   
  84.     }   
  85. }