2010-10-26 65 views
0

說我有這樣的代碼在PHP中:memcaching PHP的資源對象

$query = mysql_query("SELECT ..."); 

的語句返回一個資源對象。通常它會傳遞給mysql_fetch_array()或其中一個mysql_fetch_ *函數來填充數據集。

我想知道在這種情況下資源對象 - $查詢變量是否可以緩存在內存緩存中,然後一段時間後可以像創建它的時刻那樣獲取和使用。

// cache it 
$memcache->set('query', $query); 

// restore it later 
$query = $memcache->get('query'); 

// reuse it 
while(mysql_fetch_array($query)) { ... } 

我用Google搜索了這個問題,沒有得到太多的運氣。

我在問這是因爲它看起來比「先填充結果數組然後緩存」的方式輕得多。

那麼有可能嗎?

+0

不,不可能... – ircmaxell 2010-10-26 00:42:58

回答

2

我對此表示懷疑。從序列化手冊條目

serialize()處理除資源類型以外的所有類型。

編輯:資源通常與創建它們的服務綁定在一起。我不知道memcached是否使用序列化,但我猜它會受到相同的限制。

2

Memcache擴展序列化對象,然後將它們發送到Memcached服務器。正如另一張海報提到的,資源不能被序列化。資源基本上是對數據庫服務器的網絡連接的參考。您不能緩存網絡連接並在以後重新使用它。您只能緩存通過連接傳輸的數據。

有了這樣的查詢,您應該在緩存它們之前獲取所有行。

$all_results = array(); 
while ($row = mysql_fetch_array($query)) { 
    $all_results[] = $row; 
} 
$memcache->set('query', $all_results); 

現代數據庫驅動程序,如庫MySQLi和PDO有一個fetch_all()功能將獲取所有行。這簡化了一些事情。

當您稍後檢索該陣列時,只需使用foreach()即可對其進行迭代。這不適用於非常大的查詢結果(Memcached有1MB的限制),但對於大多數用途,您不應該有任何問題。