亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP中常用的緩存技術介紹

2024-05-04 21:48:08
字體:
來源:轉載
供稿:網友

數據緩存:這里所說的數據緩存是指數據庫查詢緩存,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,如果不存在,就連接數據庫,得到數據,并把查詢結果序列化后保存到文件中,以后同樣的查詢結果就直接從緩存文件中獲得,代碼如下:

  1. <?php 
  2. $sql = 'SELECT * FROM users'
  3. $key = md5($sql);   //memcached 對象標識符 
  4. if ( !($datas = $mc->get($key)) ) { 
  5.     //    在 memcached 中未獲取到緩存數據,則使用數據庫查詢獲取記錄集。 
  6.     echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"
  7.     $conn = mysql_connect('localhost''test''test'); 
  8.     mysql_select_db('test'); 
  9.     $result = mysql_query($sql); 
  10.       while ($row = mysql_fetch_object($result)) 
  11.         $datas[] = $row
  12.     //    將數據庫中獲取到的結果集數據保存到 memcached 中,以供下次訪問時使用。 
  13.     $mc->add($key$datas); 
  14. else { 
  15.       echo "n".str_pad('Read datas from memcached.', 60, '_')."n"
  16. var_dump($datas); 
  17. ?> 

頁面緩存:每次訪問頁面的時候,都會先檢測相應的緩存頁面文件是否存在,如果不存在,就連接數據庫,得到數據,顯示頁面并同時生成緩存頁面文件,這樣下次訪問的時候頁面文件就發揮作用了,模板引擎和網上常見的一些緩存類通常有此功能,代碼如下:

  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.   { 
  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 */ 

內存緩存:Memcached是高性能的,分布式的內存對象緩存系統,用于在動態應用中減少數據庫負載,提升訪問速度.

dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 數據庫內存緩存系統.

以上的緩存技術雖然能很好的解決頻繁查詢數據庫的問題,但其缺點在在于數據無時效性,下面我給出我在項目中常用的方法,代碼如下:

  1. class MemcacheModel { 
  2. private $mc = null; 
  3. /** 
  4. * 構造方法,用于添加服務器并創建memcahced對象 
  5. */ 
  6. function __construct(){ 
  7. $params = func_get_args(); 
  8. $mc = new Memcache; 
  9. //如果有多個memcache服務器 
  10. ifcount($params) > 1){ 
  11. foreach ($params as $v){ 
  12. call_user_func_array(array($mc'addServer'), $v); 
  13. //如果只有一個memcache服務器 
  14. else { 
  15. call_user_func_array(array($mc'addServer'), $params[0]); 
  16. $this->mc=$mc
  17. /** 
  18. * 獲取memcached對象 
  19. * @return object memcached對象 
  20. */ 
  21. function getMem(){ 
  22. return $this->mc; 
  23. /** 
  24. * 檢查mem是否連接成功 
  25. * @return bool 連接成功返回true,否則返回false 
  26. */ 
  27. function mem_connect_error(){ 
  28. $stats=$this->mc->getStats(); 
  29. if(emptyempty($stats)){ 
  30. return false; 
  31. }else
  32. return true; 
  33. private function addKey($tabName$key){ 
  34. $keys=$this->mc->get($tabName); 
  35. if(emptyempty($keys)){ 
  36. $keys=array(); 
  37. //如果key不存在,就添加一個 
  38. if(!in_array($key$keys)) { 
  39. $keys[]=$key;  //將新的key添加到本表的keys中 
  40. $this->mc->set($tabName$keys, MEMCACHE_COMPRESSED, 0); 
  41. return true;   //不存在返回true 
  42. }else
  43. return false;  //存在返回false 
  44. /** 
  45. * 向memcache中添加數據 
  46. * @param string $tabName 需要緩存數據表的表名 
  47. * @param string $sql 使用sql作為memcache的key 
  48. * @param mixed $data 需要緩存的數據 
  49. */ 
  50. function addCache($tabName$sql$data){ 
  51. $key=md5($sql); 
  52. //如果不存在 
  53. if($this->addKey($tabName$key)){ 
  54. $this->mc->set($key$data, MEMCACHE_COMPRESSED, 0); 
  55. /** 
  56. * 獲取memcahce中保存的數據 
  57. * @param string $sql 使用SQL的key 
  58. * @return mixed 返回緩存中的數據 
  59. */ 
  60. function getCache($sql){ 
  61. $key=md5($sql); 
  62. return $this->mc->get($key); 
  63.  
  64. /** 
  65. * 刪除和同一個表相關的所有緩存 
  66. * @param string $tabName 數據表的表名 
  67. */  
  68. function delCache($tabName){ 
  69. $keys=$this->mc->get($tabName); 
  70. //刪除同一個表的所有緩存 
  71. if(!emptyempty($keys)){ 
  72. foreach($keys as $key){ 
  73. $this->mc->delete($key, 0); //0 表示立刻刪除 
  74. //刪除表的所有sql的key 
  75. $this->mc->delete($tabName, 0);  
  76. /** 
  77. * 刪除單獨一個語句的緩存 
  78. * @param string $sql 執行的SQL語句 
  79. */ 
  80. function delone($sql){ 
  81. $key=md5($sql); 
  82. $this->mc->delete($key, 0); //0 表示立刻刪除 

時間觸發緩存:檢查文件是否存在并且時間戳小于設置的過期時間,如果文件修改的時間戳比當前時間戳減去過期時間戳大,那么就用緩存,否則更新緩存.

設定時間內不去判斷數據是否要更新,過了設定時間再更新緩存,以上只適合對時效性要求不高的情況下使用,否則請看下面.

內容觸發緩存:當插入數據或更新數據時,強制更新緩存.

在這里我們可以看到,當有大量數據頻繁需要更新時,最后都要涉及磁盤讀寫操作,怎么解決呢?我在日常項目中,通常并不緩存所有內容,而是緩存一部分不經常變的內容來解決,但在大負荷的情況下,最好要用共享內存做緩存系統.

到這里PHP緩存也許有點解決方案了,但其缺點是,因為每次請求仍然要經過PHP解析,在大負荷的情況下效率問題還是比效嚴重,在這種情況下,也許會用到靜態緩存.

靜態緩存:這里所說的靜態緩存是指HTML緩存,HTML緩存一般是無需判斷數據是否要更新的,因為通常在使用HTML的場合一般是不經常變動內容的頁面,數據更新的時候把HTML也強制更新一下就可以了.

也有像thinkphp的靜態緩存,ThinkPHP官方手冊寫道靜態規則的定義有三種方式,代碼如下:

  1. Return Array( 
  2.  
  3. ‘ActionName’=>array(‘靜態規則’,’靜態緩存有效期’,’附加規則’), //第一種 
  4.  
  5. ‘ModuleName:ActionName’=>array(‘靜態規則’,’靜態緩存有效期’,’附加規則’),//第二種 
  6.  
  7. ‘*’=>array(‘靜態規則’,’靜態緩存有效期’,’附加規則’),//第三種 
  8.  
  9. …更多操作的靜態規則 
  10.  

第一種是定義全局的操作靜態規則,例如定義所有的read操作的靜態規則為:'read'=>array('{id}','60').

其中,{id} 表示取$_GET[‘id’] 為靜態緩存文件名,第二個參數表示緩存60秒.

第二種是定義某個模塊的操作的靜態規則,例如,我們需要定義Blog模塊的read操作進行靜態緩存.

‘Blog:read’=>array(‘{id}’,-1).

第三種方式是定義全局的靜態緩存規則,這個屬于特殊情況下的使用,任何模塊的操作都適用,例如:

‘*’=>array(‘{$_SERVER.REQUEST_URI|md5}’),根據當前的URL進行緩存。

我這里在靜態緩存規則文件htmls.php中寫,代碼如下:

<?php return array(   'getHtml' => array('{:action}', -1),//-1表示永久緩存  );?>   

SMARTY緩存,代碼如下:

  1. <?php 
  2. require('./smarty/Smarty.class.php'); 
  3. $smarty = new Smarty; 
  4.  
  5. $smarty->caching = true; 
  6.  
  7. if(!$smarty->is_cached('index.tpl')) { 
  8.     // No cache available, do variable assignments here. 
  9.     $contents = get_database_contents(); 
  10.     $smarty->assign($contents); 
  11. $smarty->display('index.tpl'); 
  12. ?> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产中文字幕| 8090理伦午夜在线电影| 国产精品视频中文字幕91| 中文字幕国产日韩| 91九色国产视频| 亚洲最大的网站| 久久精品亚洲94久久精品| 亚洲午夜精品久久久久久久久久久久| 国产精品露脸自拍| 国产国产精品人在线视| 国产成人精品一区二区| 亚洲高清久久网| 亚洲精品成人久久| 51久久精品夜色国产麻豆| 国语自产精品视频在线看一大j8| 日韩精品小视频| 欧美激情在线狂野欧美精品| 91啪国产在线| 国产精品久久久av| 日韩中文有码在线视频| 欧美国产一区二区三区| 亚洲成人久久久久| 欧美亚洲视频在线观看| 日韩av最新在线观看| 亚洲va欧美va国产综合久久| 久久久精品在线观看| 91超碰caoporn97人人| 亚洲天堂av综合网| 日本一区二三区好的精华液| 精品久久久久久国产| 97在线视频免费| 亚洲天堂色网站| 亚洲伊人成综合成人网| 精品国产91久久久久久老师| 欧美电影免费观看高清| 精品国产一区二区三区久久久| 欧美激情在线播放| 亚洲网站在线播放| 亚洲一区二区三区在线视频| 色在人av网站天堂精品| 亚洲人成网站色ww在线| 8090理伦午夜在线电影| 欧美视频二区36p| 精品国产区一区二区三区在线观看| 中文字幕av一区二区三区谷原希美| 久久成人精品电影| 久久人人爽人人爽人人片av高请| 欧美午夜精品久久久久久浪潮| 日韩欧美中文第一页| 亚洲桃花岛网站| 亚洲人成电影网站色…| 国产精品日韩欧美综合| 一区二区三区视频在线| 欧美在线影院在线视频| 欧美一性一乱一交一视频| 国产一区二区av| 国产在线a不卡| 国产精品主播视频| 日韩禁在线播放| 精品国产一区二区三区在线观看| 亚洲第一级黄色片| 亚洲一区二区黄| 亚洲成人精品在线| 欧美肥臀大乳一区二区免费视频| 欧美高清videos高潮hd| 久久久久国产精品一区| 欧美激情伊人电影| 欧美日韩亚洲国产一区| 久久久久久网站| 日本欧美黄网站| 97视频在线观看网址| 日韩美女视频在线观看| 国产精品一区专区欧美日韩| 精品亚洲国产视频| 国产在线精品成人一区二区三区| 国产精品久久久久久久久男| 日韩国产在线播放| 国产99在线|中文| 欧美理论在线观看| 最近2019年日本中文免费字幕| 一区国产精品视频| 国产精品日韩在线观看| 97超视频免费观看| 欧美日韩国产va另类| 日韩在线激情视频| 亚洲欧美综合区自拍另类| 午夜精品久久久久久99热软件| 国产做受高潮69| 日韩在线观看免费高清| 国产欧美一区二区三区在线看| 欧美日韩国产一区二区| 91综合免费在线| 日韩精品福利在线| 伊人久久精品视频| 欧美日韩在线影院| 亚洲自拍av在线| 伊人精品在线观看| 91久久夜色精品国产网站| 成人亚洲综合色就1024| 国产成人精品免费久久久久| 欧美精品一区三区| 97精品欧美一区二区三区| 久久免费视频观看| 欧美刺激性大交免费视频| 69久久夜色精品国产7777| 91久久精品美女高潮| 91精品久久久久久久久久久久久久| 精品动漫一区二区三区| 亚洲天堂av网| 成人国产精品av| 91精品视频观看| 2019中文字幕免费视频| 亚洲视频第一页| 午夜精品久久久久久久久久久久久| 国产日产欧美精品| 欧美乱大交做爰xxxⅹ性3| 这里只有精品在线播放| 亚洲97在线观看| 亚洲天堂av图片| 日韩在线观看网站| 日韩精品在线免费观看视频| 在线电影中文日韩| 欧美大人香蕉在线| 91精品国产网站| 成人黄色免费网站在线观看| 日韩精品在线免费观看| 97激碰免费视频| 欧美激情一区二区三区久久久| 最新69国产成人精品视频免费| 久久69精品久久久久久国产越南| 国产精品流白浆视频| 97国产精品视频| 国产女人18毛片水18精品| 国产亚洲精品久久久久动| 久久精品国产一区二区三区| 欧美亚洲在线视频| 韩国美女主播一区| 国产日韩在线看| 亚洲综合中文字幕在线观看| 精品亚洲男同gayvideo网站| 97激碰免费视频| 亚洲国产精品悠悠久久琪琪| 国产精品91免费在线| 成人激情黄色网| 欧洲中文字幕国产精品| 国产精品毛片a∨一区二区三区|国| 日韩有码在线播放| 成人美女av在线直播| 亚洲欧美国产一区二区三区| 国产精品美女www爽爽爽视频| 国产99久久精品一区二区| 欧美插天视频在线播放| 精品一区二区三区四区在线| 国产亚洲xxx| 国产成人亚洲综合91| 亚洲人永久免费| 亚洲影院在线看| 成人av在线网址| 91精品国产综合久久男男| 日韩中文字幕在线看| 2018中文字幕一区二区三区| 亚洲第一中文字幕在线观看| 色狠狠av一区二区三区香蕉蜜桃| 亚洲国产成人在线视频|