PHP - Memcached: кэширование ресурсов MySql - PullRequest
0 голосов
/ 05 августа 2011

Это не работает

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

2 голосов
/ 12 августа 2011

Вы просто не можете кэшировать ресурс.Кэшируемые данные должны быть сериализуемыми:

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;
}
}

Эта функция хорошо работает, если запрос возвращает только одну строку.Если ваш запрос возвращает несколько строк, вам, возможно, придется поработать над результатами.В частности, просмотрите результаты и поместите их в многомерный массив, как говорит талисин.

0 голосов
/ 05 августа 2011

Если ваша конструкция $ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...