我試圖用Memcache中的函數擴展我的PDO類。特別是,我創建了一個函數cache_execute
,它允許我首先檢查結果是否存在於緩存中,然後返回緩存中的信息,或者如果信息尚不存在,則返回數據庫中的信息在緩存中(以及將信息中的緩存,如果不存在的話)模擬PDOStatement ::執行
這裏是我當前的代碼示例:
namespace trf;
class StatementWithCaching extends \PDOStatement {
public $db;
public $cache;
protected function __construct(&$db) {
$this->db =& $db;
}
function cache_execute($array = NULL , $cache = FALSE , $cacheTime = 1800) {
if(is_a($cache , 'Memcache')) {
$query = $this->queryString;
foreach ($array as $key => $value) {
$query = str_replace(':' . $key , "'" . addslashes($value) . "'", $query);
}
try {
$memResults = $this->mconn->get(md5($this->queryString));
}
catch (\Exception $e) {
$memResults = FALSE;
}
} else {
}
}
}
我的問題是 - 我怎麼把信息從緩存中檢索並存儲在可由PDOStatement::fetch()
,PDOStatement::fetchAll()
等檢索的地方
我的目標是能夠運行StatementWithCaching::execute()
或StatementWithCaching::cache_execute()
並仍以相同方式檢索結果(使用StatementWithCaching::fetch()
或StatementWithCaching::fetchAll()
)。
你不能,而不是與pdostatement對象。他們不會知道任何有關您的緩存的信息。你的主要的pdo包裝應該包裝「準備」/「執行」並返回你自己的緩存感知對象。 – 2014-12-04 14:53:33
問題不在於緩存,它知道如何將信息存儲在可由PDOStatement :: fetch()或PDOStatement :: fetchAll()檢索的位置,除非我誤解了你。 – 2014-12-04 14:55:39
,就像我說過的,不可能使用pdostatement對象。它不知道你的緩存。所以你的pdo包裝必須擴展「準備」來返回一個「MyCacheAwarePDOStatement」對象,而該對象擴展了pdostatement。 – 2014-12-04 14:56:43