2012-05-31 38 views
0

目前我在我的基於mvc的網站中使用php和apc,這是一個定製的簡單mvc,所以我試圖構建它以適應我的需求。緩存緩存控制器中的對象還是緩存方法中的查詢會更好嗎?

但是我不確定哪裏是處理緩存的首選位置?

我有兩個選擇(我認爲)..要麼做這意味着對象的各種控制器的所有高速緩存被存儲在緩存中,或儲存在查詢緩存返回數據的方法裏面:

控制器實施例:

function showPage() { 

    $pageOb = new Page(); 

    $key = md5('pageOb->getQuery()'); 

    if(!$data = apc_fetch($key)){ 

     $data = $pageOb->getQuery(); 
     apc_add($key, $data, 600); 
    } 

    require 'template.php'; 
} 

方法示例:

function getQuery(){ 

    $sql = "SELECT * FROM table"; 
    $key = md5('query'.$sql); 

    if(!$data = apc_fetch($key)){ 

     $core = Connect::getInstance(); 
     $stmt = $core->dbh->prepare($sql); 
     $stmt->execute(); 
     $data = $stmt->fetchAll(); 
     apc_add($key, $data, 600); 
    } 

    return $data; 
} 

回答

2

它有點取決於你如何理解和實現模型層。這將是我會怎麼寫緩存相關的代碼在服務水平目標:

$user = $this->domainObjectFactory->build('User'); 
$user->setId(42); 

if (!$this->cacheMapper->fetch('User', $user)) 
{ 
    $mapper = $this->mapperFactory->build('User'); 
    $mapper->fetch($user); 
} 

如果你不理解的條款this comment(跳到「旁註」)可能有幫助。再次重複整個過程需要很長的時間。

據我所知,緩存本身只是一種不同的存儲形式。因此它只是數據源層的另一部分(映射器,DAO和類似結構來自哪裏)。

+0

謝謝@tereško,正是我一直在尋找的! – otporan

1

您不應該將數據模型問題捲入您的Controller中。這個原則被封裝在SRP中:http://en.wikipedia.org/wiki/Single_responsibility_principle

你的第二種解決方案比較好,但是通過進一步抽象從數據源中檢索數據可以得到改進。這裏有一篇關於這個主題的很好的參考文章,雖然使用的語言是不同的模式仍然保留:http://www.alachisoft.com/resources/articles/domain-objects-caching-pattern.html

相關問題