Boostez les performances de PHP avec memcache

Catégorie: Web (Mis à jour le 05-12-2014 22:13:14)

Un cache est censé permettre l'accés rapide à des données volatiles sans les recalculer. Cela peut être le simple résultat d'une opération, comme une page web toute entiére préte à être servie au client.

La fausse solution

Stocker ses fichiers en cache sur le disque peut sembler intéréssant, sauf que l'IO disque est lente. De plus, comme le stockage disque partage déjà ses ressources entre le chargement des fichiers statiques et celui de vos fichiers sources, il représente déjà un goulet d'étrangement.

Autre probléme, dans un environnement cloud, le stockage en lecture/écriture est couteux (synchronisation entre serveurs par exemple) alors qu'au final on n'a pas besoin d'une persistance réelle pour ce stockage.

La solution

Le stockage en RAM permet des performances bien supérieures. Les solutions existantes permettent de ne plus s'occuper de la persistance et de la destruction du cache. Elles permettent aussi de le partager (en cloud par exemple) mais aussi de décharger totalement votre serveur web vers une autre machine.

Personnelement j'ai choisis memcache, car il s'intégre relativement bien avec PHP. Mais je vous invite quand même a consulter les autres solutions comme Redis ou MemcacheD.

Application sur un cas réel

L'idéal est de séparer le stockage de votre application en deux modes: le read-only (fichiers sources), et le write-only (les logs). Tout le reste doit se partager entre des solutions de stockage dédiées pour ça (base de donnée ou serveur de cache).

Par exemple, en transférant les sessions et le cache de laravel vers un serveur memcache, on peux garder seulement les logs sur le stockage partagé (écriture seulement donc).

Voici le graphique des performances de ce blog tels que vu par google. On voit clairement une amélioration nette avec le passage à memcache.

Temps de téléchargement des pages vu par google

Ainsi d'après google, on passe de 900ms à moins de 300 (moyenne de toutes les pages). L'agent Newrelic et un benchmark en local confirment cette tendance.

Conclusion

Dans le web, j'entend souvent dire que chaque milliseconde gagnée est une milliseconde qui peux servir pour un client supplémentaire. Ici les performances on été triplées. Avec la même machine on peux dont potentiellement servir 3 fois plus de clients!

Qu'attendez vous pour mettre cette solution en place sur votre site?

A lire aussi:

[PHP] [Laravel] Repository (Convertir Eloquent en stdClass)

[Web] L'application du RepositoryPattern implique de séparer les modèles Eloquent du controlleur via un Repository. Voici une alternative à toArray pour découpler vos controlleurs de vos objects modeles.
Suite...

Les nouveautés de PHP 7

[Web] Avec la sortie de PHP 7, j'en profite pour faire un petit tour d'horizon sur ce qu'apporte cette nouvelle version et sur les points à considérer pour la mise à jour.
Suite...