Cas concret d’accélération d’un site web (Avec APC)

Hello les copinou 😀

Aujourd’hui je vais faire suite a mon article « j’en ai marre des sites qui mettent 50 ans … » en montrant un cas simple mais concret qui différencie un site qui est lent et chiant a utiliser d’un site rapide et efficace.

Dans l’exemple on va parler du site http://guilde-vindicta.fr, site de guilde sur le jeu World of Warcraft.

Sur ce site j’ai voulu ajouté la fonctionnalité de « link des objets » sur le forum c’est a dire de voir le tooltip de l’objet, son nom et sa qualité (légendaire, épique, rare … etc)

Le site est simple c’est un forum réalisé avec SMF (et quelques tweak pour par exemple virer les numéros de version dans le footer, d’ailleurs laisser les numéros de versions visible comme ça c’est pas du suicide messieurs les dev de SMF ?) et d’autre tweak plus « profond » du CMS et template (le TeamSpeak viewer qui utilise un script sur le même serveur pour éviter d’utiliser un service externe et donc diminuer le temps de chargement (et les cookies de traçage tout ça tout ça, oué je met une parenthèse dans une parenthèse ) … etc).

Pour rajouter mon « link d’objet » j’ai utilisé ceci

En regardant un peu comment ça marche on voit que c’est beaucoup de JS qui utilise un « wrapper » en php qui va récupérer chez WoW Head les données (via CURL), donc pour WoW head l’ip qui demande les données est l’ip du serveur qui héberge le site (et ça évite aussi les problèmes de « cross-domain » en JS, de base un navigateur ne peut faire des requêtes Ajax que sur le même domaine que celui d’ou provient le scripte afin d’éviter les injection XSS par exemple :p, regardez la doc de JQUERY pour plus d’info la dessus)

Le problème c’est que ce Wrapper va a chaque chargement de page qui contient des tooltips refaire une requête chez WoW head …  WTFFFFFFFFFFFFFFFFFFFFFF ?????

en passant voici le code du Wrapper original :

 

Imaginons qu’une page contiennent 50 tooltips wow head, que 10 personnes la charge dans la même seconde ça veut dire que … ON FAIT 500 REQUETES SUR LES SERVEURS DE WOW HEAD EN UNE SECONDE POUR LES MEMES DONNES, ça choque personne ça ? Sérieux ?

Concrètement il se passe quoi ? au chargement des pages le JS attends la réponse du Wraper qui attend la réponse de WoW Head donc si on est en heure de pointe on a une page qui met 12 ans a charger par ce que Wow head met du temps à repondre (et on va pas leurs en vouloir leurs API GRATUITE est surement très utilisé).

Vu que nous sommes des gens responsable et qu’on aime ce que fait WoW Head on va corriger ça et éviter de leurs pourrir leurs serveurs de requêtes totalement inutile et en passant on va augmenter de manière très significative le chargement des pages de notre forum (qui contiennent des tooltips).

Comment ?

Bah c’est simple il nous faut un système flexible qui va chercher UNE SEULE FOIS les données de nos items, on regarde ce que renvoie le Wrapper (en gros il renvoit exactement le XML de l’api de WoW head), on pourrait stocker ces données dans une bdd MYSQL mais là encore je n’aime pas l’idée car dans Wow les item changent (ils sont modifié / UP / Nerf … etc). Alors on va utiliser un cache on va garder en mémoire ce que nous renvois WoW head jusqu’au prochain redémarrage de PHP (On pourrait également utiliser un cache http comme l’excellent Varnish mais ici vu que c’est un petit site j’ai la flemme de configurer Varnish juste pour ça).

PHP APC a la rescousse.

On va simplement modifier le script qu’il vérifie si il n’a pas la réponse de wow head en cache avant d’aller faire la requête, si il a la réponse XML en cache alors on affiche la version en cache (qui se situe donc dans la RAM du serveur, ayant 32 go de RAM sur le serveur qui héberge ce site ça va j’ai de la marge …) sinon on va demander les infos a Wow Head et on garde sa réponse en cache pour la fois d’après. ce qui nous donne le script modifié suivant :

Simple mais redoutablement efficace 🙂 j’en ai profité pour verifier que le $_GET ne contienne pas n’importe quoi :p

Voilà une toute petite démonstration de l’utilisation du cache opcode APC

Vous avez aimé cet article ? Partagez-le :)

Facebook Google Plus Twitter Linkedin email

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *