2010-10-26 4 views
0

Dire que j'ai ce code en PHP:objets ressources memcaching php

$query = mysql_query("SELECT ..."); 

l'instruction renvoie un objet de ressource. Normalement, il serait passé à mysql_fetch_array() ou à l'une des fonctions mysql_fetch_ * pour remplir l'ensemble de données. Je me demande si l'objet resouce - la variable de requête $ dans ce cas peut être mis en cache dans memcache et un peu plus tard peut être récupéré et utilisé juste au moment où il est créé.

// cache it 
$memcache->set('query', $query); 

// restore it later 
$query = $memcache->get('query'); 

// reuse it 
while(mysql_fetch_array($query)) { ... } 

J'ai cherché la question, je n'ai pas eu beaucoup de chance. Je demande c'est parce qu'il semble beaucoup plus léger que la manière de "peupler le tableau de résultats d'abord, puis cache".

Alors, est-ce possible?

+0

Non, pas possible ... – ircmaxell

Répondre

2

J'en doute. À partir de l'entrée manuelle sérialiser

serialize() gère tous les types, sauf le type de ressource.

Modifier: Les ressources sont généralement liées au service qui les a créées. Je ne sais pas si memcached utilise sérialiser mais je suppose qu'il serait soumis aux mêmes limitations.

2

L'extension Memcache sérialise les objets avant de les envoyer au serveur Memcached. Comme l'autre affiche l'a mentionné, les ressources ne peuvent pas être sérialisées. Une ressource est essentiellement une référence à une connexion réseau au serveur de base de données. Vous ne pouvez pas mettre en cache une connexion réseau et la réutiliser ultérieurement. Vous pouvez uniquement mettre en cache les données qui sont transmises via la connexion.

Avec des requêtes de ce type, vous devez récupérer toutes les lignes avant de les mettre en cache.

$all_results = array(); 
while ($row = mysql_fetch_array($query)) { 
    $all_results[] = $row; 
} 
$memcache->set('query', $all_results); 

pilotes de bases de données modernes tels que MySQLi et AOP ont une fonction fetch_all() qui chercher toutes les lignes. Cela simplifie un peu les choses. Lorsque vous récupérez ce tableau plus tard, vous pouvez simplement utiliser foreach() pour parcourir ce tableau. Cela ne fonctionne pas avec des résultats de requête très volumineux (Memcached a une limite de 1 Mo), mais dans la plupart des cas, vous ne devriez pas avoir de problème avec cela.