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?
2 odpowiedzi
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.
$row
, ale nie zapewni to prawie żadnego zwiększenia wydajności, szczególnie w przypadku pobierania wielu wierszy.
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.
Podobne pytania
Nowe pytania
php
PHP to szeroko stosowany, wysokopoziomowy, dynamiczny, zorientowany obiektowo i interpretowany język skryptowy przeznaczony głównie do tworzenia stron WWW po stronie serwera. Używane w przypadku pytań dotyczących języka PHP.