To nie działa

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

Otrzymuję następującą wiadomość: PHP Warning: Memcache::set() expects parameter 1 to be string, resource given in E:\Repository\HTML\tooldent\songs\songList.tpl on line 54.

Wydaje się dziwne, dlaczego zasób nie może być buforowany? Jakieś alternatywy?

0
user007 5 sierpień 2011, 11:12
Klucz musi być ciągiem. Próbujesz użyć zasobu...
 – 
Ilia Choly
5 sierpień 2011, 11:15
Czy są jakieś obejście?
 – 
user007
5 sierpień 2011, 11:16
Nie możesz przechowywać zasobów w memcache
 – 
ajreal
5 sierpień 2011, 11:17
Tak, przechowuj wyniki, a nie zasób :O.
 – 
Jauzsika
5 sierpień 2011, 16:32
 – 
John Conde
28 lipiec 2012, 20:52

2 odpowiedzi

Najlepsza odpowiedź

Jeśli twoja konstrukcja $db użyj mysql_query:

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

Zestaw wyników nie jest ciągiem i ustawiasz klucz $ do zestawu wyników w wierszu 4.

Aktualizacja:

$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);

Wynik:

object(mysql_result)#2 (0) { }

Ale o ile wiem, nie możesz traktować tego obiektu jako normalnego obiektu mysql:

 mysql_fetch_assoc($cached_result)

Możesz spróbować utworzyć wielowymiarową tablicę ze zbioru wyników dla memcache.

-1
Talisin 5 sierpień 2011, 11:41
Rozumiem (również poprawiłem pytanie), ale nadal nie wydaje się, aby zasób był buforowany; najlepsze, co wydaje się robić, to pamięć podręczna $row, ale nie zapewni to prawie żadnego zwiększenia wydajności, szczególnie w przypadku pobierania wielu wierszy.
 – 
user007
5 sierpień 2011, 11:24
Nie możesz buforować zasobu. Zasób będzie działał dla konkretnego połączenia z bazą danych, w którym został utworzony. Ale kiedy połączenie się kończy, zasób jest nieważny.
 – 
Jeyanth Kumar
11 grudzień 2012, 10:33

Po prostu nie możesz buforować zasobu. Buforowane dane muszą być możliwe do serializacji:

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

Pamiętaj, że zmienne zasobów (tj. deskryptory plików i połączeń) nie mogą być przechowywane w pamięci podręcznej, ponieważ nie mogą być odpowiednio reprezentowane w stanie serializowanym.

Będziesz musiał utworzyć tablicę ze swoich danych, jeśli chcesz je buforować. Oto funkcja z mojej strony:

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

Ta funkcja działa dobrze, jeśli zapytanie zwraca tylko jeden wiersz. Jeśli zapytanie zwraca wiele wierszy, być może trzeba będzie trochę popracować nad wynikami. W szczególności przejrzyj wyniki i umieść je w wielowymiarowej tablicy, jak mówi Talisin.

2
Landon 12 sierpień 2011, 21:10