即時消息一個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這是頁面必須使用的最低限度。
我的問題有點兒,這樣做很好嗎,還是有更好的方法來減少查詢?
它需要任何?所有的查詢都可以緩存爲HTML模板,然後在數據更改時移除html緩存? – exussum
我想你的邏輯是有缺陷的,當你可以通過一個簡單的緩存將35次命中減少到6次,而這個緩存只能存活一次。它顯示您查詢相同的數據相當多。另一方面[MySQL已經有自己的查詢緩存](http://dev.mysql.com/doc/refman/5.1/en/query-cache.html) – Bart