PHP - Memcached:MySql资源缓存

时间:2011-08-05 07:12:38

标签: php mysql memcached

这不起作用

    $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.

看起来很奇怪,为什么资源无法缓存?任何替代方案?

2 个答案:

答案 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的结果集中创建多维数组。