2013-07-01 49 views
0

即時消息一個PHP愛好者,我工作在一個新的文章系統。我創建了一個關注簡單數據庫操作的類。每次啓動類時,此類都會檢索表名和自動增量字段,以創建與數據庫表匹配的對象。所以,當我在我的文章系統上工作時,我檢出了我的數據庫類生成的查詢日誌,並且我在一個簡單頁面上注意到了35個查詢。緩存所有查詢

現在我做了一個小緩存類:

<?php 

namespace library; 

class cache { 

    private static $instance; 

    public $arDBFields = array(); 

    public $arAIFields = array(); 

    public $arQueryResults = array(); 

    public static function get() { 
     if(! self::$instance){ 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

    public function setDBFields($name, $value) { 
     $this->arDBFields [$name] [] = $value; 
    } 

    public function getDBFields($name) { 
     if(! empty ($this->arDBFields [$name])) 
      return $this->arDBFields [$name]; 

     return array(); 
    } 

    public function setAIField($name, $value) { 
     $this->arAIFields [$name] = $value; 
    } 

    public function getAIField($name) { 
     if(! empty ($this->arAIFields [$name])) 
      return $this->arAIFields [$name]; 

     return array(); 
    } 

    public function setQueryResult($name, $cacheshit) { 
     $this->arQueryResults [$name] = $cacheshit; 
    } 

    public function getQueryResult($name) { 

     if(! empty ($this->arQueryResults [$name])) 
      return $this->arQueryResults [$name]; 

     return array(); 
    } 

} 

>

,並在我的MySQL類添加此:

if(!empty($cachedValue)){ 
      $this->query = $cachedValue ; 
     } 
     else { 
      $this->query = mysql_query ($sql , $this->connection); 
      cache::get()->setQueryResult($sql, $this->query); 
     } 

也跳過寫入查詢日誌陣列如果它有一個非空的$ cachedvalue

現在我的查詢日誌顯示6查詢這個頁面,a nd這是頁面必須使用的最低限度。

我的問題有點兒,這樣做很好嗎,還是有更好的方法來減少查詢?

+0

它需要任何?所有的查詢都可以緩存爲HTML模板,然後在數據更改時移除html緩存? – exussum

+0

我想你的邏輯是有缺陷的,當你可以通過一個簡單的緩存將35次命中減少到6次,而這個緩存只能存活一次。它顯示您查詢相同的數據相當多。另一方面[MySQL已經有自己的查詢緩存](http://dev.mysql.com/doc/refman/5.1/en/query-cache.html) – Bart

回答

0

緩存是一件好事,尤其是如果您的內容不經常更改。事實上,許多PHP框架都會爲你做到這一點。

0

如果你使用的是Windows/IIS環境,那麼你可以安裝WINCACHE並利用用戶緩存選項在內存中存儲經常訪問的數據,所以好處是有多個頁面請求(取決於你多久設置TTL)。安裝WinCache非常簡單,而且使代碼運行速度更快,因爲它的基本功能是緩存OPCode,因此PHP不必爲每個請求創建OPCode。

WINCACHE是我有經驗,但我敢肯定,大多數Web服務器應用程序(阿帕奇,IIS等)也有類似的東西(APC是流行在Apache)。

http://www.iis.net/downloads/microsoft/wincache-extension

直接回答你的問題。編寫自己的緩存代碼將有助於更好地理解PHP,我認爲這是一件好事。然而,爲了獲得最大的回報,你應該整合一個現有的緩存機制並且圍繞它編寫代碼。