2010-07-22 20 views
0

爲了記錄,我使用Windows Vista和XAMPP(PHP 5.3.1)。在Windows上使用PHP和APC發佈緩存結果集

我想使用APC來緩存數據庫結果。我對字符串變量做了一個簡單的APC測試,似乎工作正常。但是,當我嘗試使用數據庫結果資源執行同樣的操作時,只要我想使用它,就會收到緩存中的數據'不是有效的MySQL結果資源'的投訴。

這裏是我的代碼:

$key_hash_str = md5($query_sql_str); 
$cache_res = Mox_Cache_APC::fetch($key_hash_str);; 

switch(true) 
{ 
case (!$cache_res): 
    $query_result_res = self::executeQuery($query_sql_str); 
    Mox_Cache_APC::store($key_hash_str, $query_result_res); 
    return $query_result_res;     
break; 

default: 
    return $cache_res; 
} 

Mox_Cac​​he_APC是我APC類,並提取和存儲是apc_fetch()和apc_store()只是抽象。 executeQuery是一個靜態函數,在該代碼寫入的類中定義(很明顯,用於執行查詢)。

我做錯了什麼?在緩存之前需要對結果集做些什麼?

請注意。

+0

你可以做print_r($ query_result_res)併發布結果嗎? – 2010-07-22 15:16:35

+0

我只是做了print_r(),這是我得到如下: 資源ID#16 – 2010-07-22 15:19:41

回答

1

簡短回答:您不能存儲原始結果資源。你可以將它存入本地數組(使用類似mysql_fetch_assoc()的東西),然後存儲它,但不是資源。

但是,爲什麼不啓用MySQL的查詢緩存呢?它和這個完全相同。當然,它需要額外的TCP往返數據庫服務器,但是當你插入/更新/刪除表中的行時,它會自動從數據庫中刪除過時的緩存結果......除非你在同一個數據庫上運行數百個查詢頁面,它應該是大致相同的性能明智的...

+0

無賴!好的,我有些懷疑這一點。謝謝你的提示。我沒有使用MySQL緩存,因爲我需要一個與數據庫無關的解決方案,並且可以跨不同平臺進行移植。 – 2010-07-22 15:42:46

1

這是可以預料的。您無法緩存數據庫資源。

事實上,你不能緩存任何其他的PHP 資源。 PHP資源是一種特殊的類型。變量本身只包含一個標識符和資源類型。該標識符可被接受該類型資源的函數使用以獲取其數據並對其進行處理;然而,PHP本身並不知道這個值(包括它的大小以及是否依賴於其他資源)。

也沒有通用的序列化機制,可以通過提供資源的擴展來實現,就像對象一樣。因此,無法緩存資源。

如果需要,可以將結果以數組形式緩存。

+0

非常感謝。我懷疑這一點,但我只是想確定。乾杯。 – 2010-07-22 15:43:24