这不起作用
$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 :(得分: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所说。
答案 1 :(得分:-1)
如果$ db构造使用mysql_query:
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success.
结果集不是字符串,您将$ key设置为第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)
您可以尝试从memcache的结果集中创建多维数组。