2011-08-05 59 views
0

這不起作用PHP - Memcached的:MySQL的資源緩存

$get_data_qry = "SELECT * FROM list;"; 
    $get_data_res = $db->Query($get_data_qry); 

    $key   = 'someKey'; /** silly mistake corrected after being notified by comments*/ 
    $get_data_res = $memcache->get($key); 

    if ($get_data_res) { 
     PushOutput($get_data_res); 
     echo "<br/>Directly from cache"; 
    } 

    else { 
     $get_data_res = $db->Query($get_data_qry); 
     $memcache->set($key, $get_data_res, 0, 20000); /*Store the MySql resource in the cache*/ 
     PushOutput($get_data_res); 
    } 

我得到以下信息:PHP Warning: Memcache::set() expects parameter 1 to be string, resource given in E:\Repository\HTML\tooldent\songs\songList.tpl on line 54.

這似乎不可思議,爲什麼一個資源不能被緩存?任何替代品?

+0

該鍵需要是一個字符串。您正在嘗試使用資源... –

+0

@ilia是否有任何解決方法? – user007

+0

您無法將資源存儲到memcache – ajreal

回答

-1

如果你的$ DB結構使用的mysql_query:

For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success. 

一個結果是不是字符串,並設置在第4行

更新$關鍵中的結果:

$result = $db->query("SELECT * FROM table"); 
$memcache->set(1,$result,TRUE,86400) or die ("Failed to save data"); 
$cached_result = $memcache->get(1); 
var_dump($cached_result); 

輸出:

object(mysql_result)#2 (0) { } 

但據我所知,你不能把這個對象作爲一個正常的MySQL對象:

mysql_fetch_assoc($cached_result) 

你可以嘗試創建一個多維數組出來的結果集的內存緩存的。

+0

我明白了(也糾正了這個問題),但它似乎仍然沒有緩存資源;看起來最好的做法是緩存'$ row',但是這不會提高任何性能,特別是在多行提取的情況下。 – user007

+0

/更新我的回答 – Talisin

+0

爲什麼要降級?請解釋 – Talisin

2

你只是不能緩存資源。該數據被緩存需要被序列化:

http://php.net/manual/en/memcache.set.php

請記住,資源變量(即文件和連接描述符)不能被存儲在緩存中,因爲它們不能充分地在序列化狀態表示。

如果你想緩存它,你需要從你的數據中創建一個數組。這裏是我的網站的一個功能:

function query_rows_cached($query){ 
$rowset = $memcache->get(md5($query)); 
if($rowset){ 
    return $rowset; 
} 
else{ 
    $r=mysql_fetch_array(mysql_query($q)); 
    $days=1; 
    $memcache->set(md5($query),$r, false, 60*60*24*$days); 
    return $r; 
} 
} 

如果查詢只返回一行,這個函數效果很好。如果您的查詢返回多行,您可能需要對結果進行一些處理。具體來說,按照Talisin的說法,通過結果並將它們放入多維陣列中。