mercredi 23 Fév 2011

Accélérer son serveur web avec MemCache

PHPParfois certaines pages en PHP nécessitent de lourdes requêtes à la base de données, voire à une source extérieure, et MemCache permet d'accélérer tout ça en mettant des données dans un cache en mémoire vive, donc très rapide.

Ces données peuvent être des pages, des morceaux de pages, des résultats de requêtes ou des sources externes. Par exemple dans une colonne d'un site web, l'affichage d'autres articles liés peut demander une requête SQL complexe. Vous pouvez mettre en cache le résultat direct de la requête (via un tableau sérialisé par exemple) ou même l'HTML généré. Au lieu d'afficher cette partie de la page, vous la mettez en cache et la ressortez ainsi instantanément.

~

Pour gagner du temps sur des pages déjà créé, on peut utiliser la temporisation de sortie de PHP avec ob_start() puis récupérer et afficher le résultat avec ob_get_flush(). Là on le met en cache et les prochaines lectures de cette page feront uniquement appel au cache.

~

Comment installer MemCache

Il faut en fait installer à la fois le serveur MemCached, un démon qui recevra les données, et l'extension PHP qui est le client qui lira ces données.

Suivant la distribution Linux de votre serveur, vous devrez taper des lignes de commande du style (exemple pour CentOS):

yum install memcached
chkconfig memcached on
service memcached start

et pour l'extension PHP, il faut aussi installer Zlib car MemCache peut compresser les données:

yum install zlib-devel
pecl install memcache

~

Comment utiliser MemCache

Vous pouvez lire la documentation de PHP, ce n'est pas difficile. Des fonctions set et get permettent de stocker et récupérer nos données. Il suffit de trouver un bon identifiant pour chacune. Cela peut être une clé MD5 pour une requête SQL.

$memcache_obj = new Memcache;
$memcache_obj->connect ('localhost', 11211);
$memcache_obj->set('test', 'Bonjour le monde!);
echo $memcache_obj->get ('test');

~

Exemple concret sur des pages complètes

J'ai récemment créé un comparateur Amazon eBay pour le portail Kiao. Pour chaque rayon, recherche et produit, les informations viennent de flux XML chez Amazon, puis de chez eBay pour la comparaison de prix et une dernière requête chez Yahoo pour avoir des informations supplémentaires. Toutes ces requêtes externes étant plus lentes qu'une recherche locale et surtout le nombre de requêtes par heures étant limitées, j'ai décidé de mettre en cache toutes les pages.

Au début de chaque page, je teste si elle est dans le cache avec son identifiant (disons la référence du produit $ref):


$memcache_obj = new Memcache;
$memcache_obj->connect ('localhost', 11211);
if (($memcache_page = $memcache_obj->get($ref)) !== false)
{
  echo $memcache_page;
  exit;
}
/* Sinon, on stocke l'affichage avec ob_start. */
ob_start();

En fin de page, si elle n'était pas dans le cache, je l'y met tout en l'affichant avec ob_get_flush():

$page = ob_get_flush(); /* Affiche et retourne le contenu de la page. */
$memcache_obj->set($ref, $page, MEMCACHE_COMPRESSED, 3600*24*12); // Durée en secondes, 12 jours

~

J'espère que cet article vous aura donné envie d'essayer cet outil de cache, très léger, pour accélérer votre site. Vous pouvez poser des questions en commentaire et n'oubliez pas de passer par la boutique Kiao pour vos achats culturels et multimédia! ;-)


café Cet article vous a aidé? 
Offrez-moi un café!
Agrégateur informatique

Une réponse à “Accélérer son serveur web avec MemCache”

  1. 1
    a (novirent.over-blog.com) a dit:

    Merci pour votre site web et pour le lien vers le blog pour faire la promotion de son site

Laisser un commentaire

Azur Dev