Turbocharger votre site Web avec Memcached

Votre dernier site PHP / MySQL est enfin en ligne. Et c'est génial. Mais ce n'est pas aussi rapide que vous le souhaitez, en raison des nombreuses requêtes SQL exécutées chaque fois qu'une page est générée. Et au-dessus de cela, vous avez l’impression que les charges ne seront pas bonnes. Et vous avez probablement raison.

Dans ce didacticiel, nous verrons comment améliorer considérablement la réactivité de votre site Web et l'aider à s'adapter à la gestion de nombreux visiteurs simultanés en mettant en place une couche de cache entre votre code et votre base de données. La bonne nouvelle est que c'est assez facile et peut être fait en quelques minutes.!


Présentation de Memcached

Memcached est un système de mise en cache de données haute performance en mémoire..

Les sites Web et les applications Web modernes utilisent beaucoup de données, et il n'est pas rare de compter jusqu'à 20 voire 30 requêtes SQL dans une génération de page unique. Multipliez ce montant par un grand nombre de visiteurs et vous obtenez souvent une base de données surchargée, ainsi que des pages nécessitant quelques secondes pour être générées et envoyées au client..

L'outil que nous allons utiliser aujourd'hui pour améliorer les performances s'appelle Memcached. Il s'agit d'un système de mise en cache de données en mémoire hautes performances. Autrement dit, une application très rapide qui s'exécute sur votre serveur et utilise une fraction de la mémoire disponible pour stocker un tableau associatif de données. Vous pouvez demander à Memcached de faire deux choses:

  • Stocker la valeur V avec la clé K
  • Récupérer la valeur V stocké avec la clé K

Cela a l'air minimaliste, mais vous pouvez faire beaucoup de choses grâce à ces deux fonctionnalités, comme nous le verrons très bientôt. En fait, Memcached peut faire encore plus de choses, mais elles sont toutes liées au stockage ou à la récupération de données..

L'installation de Memcached sur des distributions Linux modernes est assez simple:

  • Ubuntu: sudo apt-get install memcached
  • Gentoo: sudo emerge installer memcached
  • Chapeau rouge : sudo yum install memcached

Une fois installé, Memcached sera automatiquement lancé à chaque démarrage de votre serveur. Vous pouvez définir la quantité de mémoire réservée à Memcached, ainsi que d’autres options, dans le fichier de configuration (/etc/memcached.conf). 64 Mo est alloué par défaut. Le fichier de configuration contient également l'adresse IP et le port auquel Memcached sera lié. Les valeurs par défaut (127.0.0.1 et 11211) convient pour une configuration standard.


Accéder à Memcached à partir de PHP

Nous voulons stocker et récupérer des données de vos scripts PHP. Cela signifie que nous allons avoir besoin d'un moyen de se connecter à Memcached à partir de PHP. Pour cela, nous allons installer l'extension "Memcache" pour PHP. Comme il s’agit d’une extension PECL, il est très facile à installer avec le "pecl" en tapant la commande suivante:

 sudo pecl installe memcache

Il y a deux extensions PHP liées à Memcache: "Memcache" et "Memcached" (notez le "d" dans la seconde). Les deux sont très similaires, mais le premier a une empreinte plus petite. Dans ce tutoriel, nous utiliserons le Memcache plus léger. Une fois installée, cette extension doit être activée et les fonctions liées à Memcache doivent maintenant être disponibles pour vos scripts PHP..


Comment fonctionne la mise en cache?

Notre travail ici est basé sur les hypothèses suivantes:

  • récupérer des données de la base de données prend des ressources (CPU + i / o)
  • la récupération des données de la base de données prend du temps
  • nous récupérons souvent les mêmes données encore et encore

Nous souhaitons également stocker nos données d'une manière qui nous permette de les récupérer efficacement..

De manière générale, nous voulons sauvegarder nos données dans un environnement persistant (notre base de données MySQL par exemple). Mais nous souhaitons également stocker nos données d’une manière qui nous permette de les récupérer efficacement, même si le stockage n’est pas persistant. Donc, à la fin, nous aurons deux copies de nos données : l'un étant stocké dans MySQL et l'autre dans Memcache.

Voici les étapes à suivre pour y arriver:

  • Chaque opération d'écriture (SQL INSERT et Mises à jour) sera exécuté à la fois en MySQL et en Memcached
  • Chaque opération de lecture (SQL Sélections) sera exécuté dans Memcached et fera appel à MySQL en cas d'erreur

À ce stade, vous voyez probablement quelles parties de votre code doivent être modifiées: les parties où vous écrivez des données et les parties où vous lisez des données. Si votre code PHP est bien structuré, vous devriez avoir encapsulé votre code d'accès aux données dans des fonctions ou encore de meilleures classes. Si tel est le cas, la mise à jour de votre site devrait être très rapide. Si non, vous pourriez avoir un peu plus de travail.


Connexion à notre serveur de cache

Tout d’abord, créons une connexion à notre serveur Memcached. Voici le code que vous devriez utiliser, au début de vos scripts PHP:

 // Constantes de connexion define ('MEMCACHED_HOST', '127.0.0.1'); define ('MEMCACHED_PORT', '11211'); // Création de connexion $ memcache = new Memcache; $ cacheAvailable = $ memcache-> connect (MEMCACHED_HOST, MEMCACHED_PORT);

À ce stade, nous avons établi une connexion avec notre serveur Memcache. Cela a peut-être échoué, mais nous le savons grâce au $ cacheAvailable variable.


Stocker des données dans notre cache

Let's plonger dans le stockage de données. Nous allons prendre un exemple pour rendre les choses plus claires - une boutique en ligne. Nous avons un script appelé edit_product.php dont le but est de sauvegarder les données d'un produit dans notre base de données. Chacun de nos produits contient les informations suivantes:

  • identifiant
  • prénom
  • la description
  • prix

À un moment donné dans notre edit_product.php code, nous courons un INSÉRER ou METTRE À JOUR Requête SQL ayant pour but d'écrire les données de ce produit dans notre base de données MySQL. Cela pourrait ressembler à ceci:

 // Nous avons validé et assaini nos données // Nous avons échappé à tous les caractères risqués avec mysql_real_escape_string () // Maintenant nous voulons les sauvegarder dans notre base de données $ sql = "INSERT INTO products (id, name, description, price) VALUES ( $ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db);

Comme je l'ai mentionné ci-dessus, nous souhaitons stocker nos données à la fois dans notre base de données MySQL et sur notre serveur Memcached. Voici comment nous allons procéder:

 // Nous avons validé et assaini nos données // Nous avons évité tous les caractères risqués avec mysql_real_escape_string () // Maintenant, nous voulons les écrire dans notre base de données: $ sql = "INSERT INTO products (id, name, description, price) VALUES ($ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db); // Nous avons écrit nos données dans notre base de données // Maintenant, stockons le nom du produit, sa description et son prix dans notre cache // La méthode "set" indique à notre serveur Memcached de stocker les données associées à une clé spécifique if ($ querySuccess = == true) // Nous construisons une clé unique que nous pourrons reconstruire ultérieurement // Nous utiliserons le mot 'product' plus l'identifiant de notre produit (par exemple, "product_12") $ key = 'product_'. $ id; // Nous stockons un tableau associatif contenant nos données produit $ product = array ('id' => $ id, 'name' => $ name, 'description' => $ description, 'price' => $ price); // Et nous demandons à Memcached de stocker ces données $ memcache-> set ($ key, $ product); 

À ce stade, notre base de données et notre cache contiennent nos données de produit..


Récupérer des données de notre cache

Au cas où notre cache serait indisponible, nous voudrions revenir à MySQL.

Récupérons maintenant nos données. Dans le même exemple, disons que notre boutique en ligne a un script appelé product.php qui affiche un produit spécifique. Accéder à la page product.php? id = 12 affichera le produit dont l'identifiant est 12.

À un moment donné dans notre product.php code, nous courons un SÉLECTIONNER Requête SQL ayant pour but de récupérer les données d'un produit de notre base de données MySQL. Cela pourrait ressembler à ceci:

 // Nous avons validé et assaini nos données // Nous avons échappé à tous les caractères risqués avec mysql_real_escape_string () // Maintenant, nous voulons lire dans notre base de données: $ sql = "SELECT id, nom, description, prix FROM produits WHERE id =" . $ id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);

Comme nous l'avons dit plus haut, nous souhaitons récupérer nos données de notre serveur Memcached si possible, car elles sont plus rapides que celles de MySQL. Mais au cas où notre serveur de cache ne pourrait pas être atteint, ou s'il ne stocke simplement pas les données dont nous avons besoin, nous voulons nous tourner vers MySQL. Voici comment nous allons procéder:

 // Initialise notre variable $ product $ product = null; // Tout d'abord, nous vérifions que notre serveur de cache est disponible // La variable $ cacheAvailable a été initialisée lors de la connexion à notre serveur de cache si ($ cacheAvailable == true) // Nous construisons la clé que nous avons associée à nos données produit $ key = 'product_'. $ id; // Nous récupérons maintenant les données de notre serveur de cache $ product = $ memcache-> get ($ key);  // avons-nous besoin d'accéder à MySQL? if (! $ product) // Dans le cas où nous le faisons… car notre variable $ product est toujours nulle // nous avons validé et assaini nos données // nous avons échappé à tous les caractères risqués avec mysql_real_escape_string () // maintenant nous voulons lire à partir de notre base de données: $ sql = "ID SELECT, nom, description, prix FROM produits WHERE id =". $ id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource); 

À ce stade, nous avons récupéré les données dont nous avions besoin. Cela a probablement été fait à partir de notre cache, mais pourrait l'être à partir de MySQL si le cache n'était pas rempli ou s'il était impossible d'y accéder pour une raison quelconque..


Conclusion

Nous avons vu comment Memcached peut être utilisé pour accélérer votre site Web et limiter la charge de votre base de données. Notre exemple ci-dessus était basé sur PHP et MySQL car ces technologies sont largement déployées, mais ce principe est universel et fonctionne de la même manière avec beaucoup d'autres technologies: C / C ++, Java, Python, Ruby, Perl, .Net, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml et io sont répertoriés avec PHP sur le wiki officiel de Memcached.

Comme je l'ai brièvement mentionné plus tôt, Memcached fournit plus de fonctionnalités que le simple jeu et permet d'obtenir les méthodes que nous avons vues ci-dessus. Deux fonctionnalités supplémentaires utiles sont les mises à jour d'incrémentation / décrémentation et la possibilité de définir un délai d'expiration pour des données stockées spécifiques. Tous deux sont disponibles en PHP, avec quelques autres, comme vous pouvez le constater dans la documentation de Memcache.

Amusez-vous à mettre cela en œuvre sur vos sites Web et profitez de l’amélioration gratuite des performances. Merci beaucoup d'avoir lu et s'il vous plaît laissez-moi savoir si vous avez des questions dans les commentaires ci-dessous.