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.!
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:
V
avec la clé K
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:
sudo apt-get install memcached
sudo emerge installer memcached
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.
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..
Notre travail ici est basé sur les hypothèses suivantes:
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:
INSERT
et Mises à jour
) sera exécuté à la fois en MySQL et en MemcachedSé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.
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.
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:
À 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..
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..
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.