2010-10-31 45 views
1

Je tente actuellement d'implémenter la mise en cache APC en tant que banque de données dans mon application Web.Utilisation d'APC pour stocker des données dans des tableaux

Actuellement, le système récupère des données directement à partir de la base de données MySQL et nécessite un appel de base de données par requête.

Je suis actuellement en train de tenter de changer cela en préremplissant le cache avec des données qui sont interceptées et servies depuis le cache à chaque requête.

est ici la méthode actuelle:

if(!empty($_GET['id'])){   

     $app = $db->real_escape_string($_GET['id']); 
     $result = $db->query("SELECT * FROM pages_content WHERE id = $app"); 
     $rawdata = $result->fetch_assoc(); 

}

Les données sont présentées par la sortie par:

$title = stripslashes($rawdata['title']); 
$meta['keywords'] = stripslashes($rawdata['htmlkeywords']); 
$meta['description'] = stripslashes($rawdata['htmldesc']); 
$subs = stripslashes($rawdata['subs']); 
$pagecontent = "<article>".stripslashes($rawdata['content'])."</article>"; 

Ce que je dois le script Préremplissage à faire est pour chaque ligne de données la table de données met en cache les données de chaque ligne. Le script de desserte serait alors capable d'extraire les données du cache en tant que de besoin, en utilisant quelque chose comme apc_fetch('[columname][id]').

Comment est-ce que j'ai pu le concevoir?

Je suppose que je devrais sérialiser les données?

+1

* (informationnel) * [Présentation d'APC] (http://techportal.ibuildings.com/2010/10/07/understanding-apc) et [Utilisation d'APC avec PHP] (http://devzone.zend.com/article/12618-Using-APC-with-PHP) – Gordon

+0

Aaah, génial. N'a pas vu cela dans ma recherche google:/ – bear

+0

Je ne sais pas si ces articles sont utiles pour votre question mais je me sentais qu'ils sont de bonnes informations générales, donc j'ai pensé que je les partagerais. – Gordon

Répondre

1

Je ne connais pas vraiment le schéma de cache, donc la réponse ne peut pas être exacte. Premièrement: rappelez-vous qu'APC utilise la mémoire partagée du serveur, auquel cas si vous avez plusieurs serveurs, ils iront tous chercher au moins une fois le db pour obtenir les données. Si vous essayez de stocker par colonne, vous devez être sûr de créer une sorte de verrou, sinon vous aurez des conditions de course car peut-être que lorsque vous enregistrez une colonne, tout autre pourrait changer. Ce que je vous recommande est de sauver la ligne complètement, en faisant simplement:

<?php 
foreach ($row = $mylsql->get_row()) { 
    $key = 'content_' . $row['id']; 
    apc_store($key, $row); 
} 

Mais d'autre part cela signifie que si vous avez 1000 articles, vous les enregistrer dans le cache et peut-être beaucoup d'entre eux ne sont pas lus à tout.

Int ce cas, je vous recommandons d'utiliser lazy loading:

<?php 
$id = $_GET['id']; 
$key = 'content_' . $id; 
$data = apc_fetch($key); 
if (!is_array($data)) { 
    // call mysql here 
    $data = $mylsql->get_row(); 
    apc_store($key, $data); 

} 

// your script here using $data 

cette façon vous ne mettre en cache le contenu qui est souvent frappé.

D'autre part, veuillez être en accord avec votre cache invalidation, pour éviter d'avoir d'anciennes données dans le cache.

+0

Si j'essaie d'utiliser ceci, je reçois erreur: Impossible d'utiliser l'objet de type mysqli_result comme tableau. En utilisant le code: 'foreach ($ row = $ db-> query (" SELECT * FROM pages_content ") comme clé $) { $ key = 'content_'. $ row ['id']; apc_store ($ key, $ row); } ' – bear

+0

Je suppose que vous devez utiliser' $ result-> fetch_assoc() ' –