2011-08-05 4 views
0

Cela ne fonctionne pasPHP - Memcached: mise en cache des ressources MySql

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

Je reçois le message suivant: PHP Warning: Memcache::set() expects parameter 1 to be string, resource given in E:\Repository\HTML\tooldent\songs\songList.tpl on line 54.

Il semble bizarre, pourquoi une ressource ne peut pas être mis en mémoire cache? Des alternatives?

+0

La clé doit être une chaîne. Vous essayez d'utiliser une ressource ... –

+0

@ilia Y at-il des solutions de contournement? – user007

+0

vous ne pouvez pas stocker de ressources dans memcache – ajreal

Répondre

-1

Si votre utilisation de construction db $ mysql_query:

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

ResultSet est pas une chaîne et que vous définissez $ clé du ResultSet à la ligne 4.

Mise à jour:

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

Sortie:

object(mysql_result)#2 (0) { } 

Mais pour autant que je sais que vous ne pouvez pas traiter cet objet comme objet mysql normal:

mysql_fetch_assoc($cached_result) 

Vous pouvez essayer de créer un tableau multidimensionnel de l'ensemble de résultats pour memcache.

+0

Je comprends le point (j'ai corrigé la question aussi), mais il ne semble toujours pas mettre en cache la ressource; le mieux qu'il semble faire est le cache '$ row' mais cela n'offrira pratiquement aucune augmentation de performance, en particulier dans le cas de l'extraction de plusieurs lignes. – user007

+0

/mettre à jour ma réponse – Talisin

+0

pourquoi abaisser? veuillez expliquer – Talisin

2

Vous ne pouvez pas mettre en cache une ressource. Les données besoins mises en cache sérialisable:

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

Rappelez-vous que les variables de ressources (à savoir des fichiers et des descripteurs de connexion) ne peuvent pas être stockées dans le cache, car ils ne peuvent pas être représentés de manière adéquate dans l'état sérialisé.

Vous devez créer un tableau à partir de vos données si vous souhaitez le mettre en cache. Voici une fonction de mon site Web:

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

Cette fonction fonctionne bien si la requête ne renvoie qu'une seule ligne. Si votre requête renvoie plusieurs lignes, vous devrez peut-être travailler sur les résultats. Plus précisément, parcourez les résultats et mettez-les dans un tableau multidimensionnel comme le dit talisin.

Questions connexes