2. Qui suis-je ? Lilian RIGARD - CEO & CTO Devclic - Dans l'internet depuis 1995 - Fort intérêt pour l'optimisation des sites internet - Développeur PHP et Administrateur Système / Réseau - 10 ans d'expérience en PHP - Formation : autodidacte - Twitter : @liliandev - Email : [email_address]
34. 167 000 € de CA pour l'année 2010 (source societe.com)
35. 4 ou 5 sites sur le même modèle de script avec des améliorations de la part du Webmaster ( ancien stagiaire Devclic :-) )
36.
37. Côté Serveur ->Permet de gagner très simplement de la charge et de diminuer les temps de réponse ( modification du code )
38.
39. L'architecture matérielle L'architecture logicielle doit être pensée dès le début du projet à savoir comment je vais arriver à mon but, quelle est la meilleure façon pour le faire (on doit penser optimisation dès le début) Exemple : un compteur de connectés en simultané, comment le développer sans impacter mes performances ? Facebook, à ses débuts, à utiliser une base de données MySQL, choix qui s'est annoncé très problématique puisque le site a connu de fortes indisponibilités dès lors qu'il y avait beaucoup de connectés L'architecture logicielle dimensionne l'architecture matérielle et les conséquences peuvent être lourdes si l'application est mal conçue / pensée
52. Les reverses proxys peuvent s'échanger les fichiers directement entre eux Impacts : Aucun, que du plus :-) sauf 1 cas : l'authentification Basic qui ne fonctionnait pas correctement
61. Changer le mode de fonctionnement d'Apache ( MPM Worker vs MPM Prefork ). Intérêt : MPM Worker utilise des threads et est donc moins gourmand. MPM Prefork utilise des processus. L'utilisation des threads est beaucoup plus léger au niveau du système d'exploitation. - Dans le cas de PHP : si vous voulez garder un contrôle total via vos .htaccess alors vous pouvez laisser tomber MPM Worker, les php_admin_value, ou php_value ne sont pas interprétés étant donné que l'on doit utiliser PHP en mode CGI OU FPM. Il faut donc utiliser un php.ini pour modifier les directives, ce qui devient vite lourd dans le cas où l'on héberge plusieurs sites internet … Un module ZTS doit changer la donne, ma dernière tentative s'est vouée être un échec. - Dans le cas de Python : le mode MPM Worker permet d'utiliser WSGI qui stocke en RAM les fichiers Python. Votre application Web Python devient alors un processus à part entière.
73. Utiliser une architecture à base de Master / Slave : plusieurs slaves répliquent leurs données à partir du Master. Le Master sert uniquement pour les INSERT et les Slaves pour les SELECT. On élimine le problème de la concurrence des requêtes. L'execution des requêtes passe d'abord par le log binaire de MySQL et l'ordre est envoyé à tous les SLAVE
74.
75. Mettre les tables temporaires MySQL en RAM avec un TMPFS : MySQL quand vous faites des ORDER BY utilise des tables temporaires qui sont stockées sur le disque dur et cela a pour effet de réduire très fortement les performances (un disque dur est beaucoup plus lent que de la RAM)
76. Faire en sorte d'avoir les bons index aux bons endroits, il faut tester ses requêtes avec la commande EXPLAIN de MySQL qui permet de savoir comment MySQL se débrouille avec votre requête
77.
78. Optimisation de l'architecture Optimisation du stockage de votre site internet Moins il y a d'I/O, plus vous pourrez accueillir de visiteurs sans problème -> utilisation de TMPFS pour stocker vos fichiers du site internet -> utiliser du stockage basé sur de la déduplication ( ZFS) ( moins de disques durs utilisés, moins de courant consommé, une architecture moins gourmande en besoin énergétique ) -> permet dans le cas d'un SAN ISCSI de ne pas avoir un point de failure surtout avec des filesystem de type cluster
92. Utiliser un simple <a href="/" class="logo">Mon Site Internet</a> à la place de la classique balise image et du lien qui l'entoure ( économie de bande passante car moins de code HTML dans la page et SEO optimisé )
93.
94. Réduit également la taille du fichier par la suppression des commentaires et espaces inutiles
100. Utiliser un site comme GTMetrix qui regroupe ces 2 barres sur un seul et même site, cela permet aussi d'avoir un historique
101. Pour compresser vos CSS et JavaScripts via du Minify, vous pouvez utiliser Minify ( http://code.google.com/p/minify/ ) -> en production sur Forum-Webmaster.com
102. Pour l'utilisation du CDN Google, voir ici ( http://code.google.com/intl/fr-FR/apis/libraries/ )
103. Pour optimiser vos images, il suffit de les envoyer à Smushit ( http://www.smushit.com/ysmush.it/ ), il y en a d'autres qui existent Optimisation côté Utilisateur
104. Optimisation du code source PHP -> Petit Jeu Exemple (1) Quelle fonction est la plus adaptée ou la plus rapide ? require OU require_once Réponse : La fonction require Pourquoi ? Aussi simplement que ça, require effectue une simple inclusion du fichier sans effectuer d'opérations supplémentaires alors que require_once va effectuer dans tous les fichiers existants et déjà chargés, si une fonction n'est pas déjà déclarée, ce qui induit une perte de performances de 40 % ( selon les benchmarks réalisés ) Conclusion : require_once est la fonction du fainéant ! En tout cas elle est bannie chez Devclic et est fortement déconseillée par Zend (les utilisateurs du Zend Framework sont invités à utiliser la ligne de commande qui va bien et qui permet de supprimer tous les require_once)
105. Optimisation du code source PHP -> Petit Jeu Exemple (2) Quelle fonction est la plus adaptée ou la plus rapide pour récupérer le contenu d'un fichier ? require OU file_get_contents Réponse : La fonction file_get_contents Pourquoi ? Tout simplement parce que require demande à l'analyseur PHP de parcourir le fichier à la recherche de code PHP alors que filte_get_contents est tout simplement un alias de fopen / fget / fclose. L'appel à require ou include alors que l'on sert pertinemment que l'on a pas de code PHP dans le fichier appelé fait perdre du temps et aussi augmente la charge Conclusion : mauvaise habitude de la part des développeurs et aussi de la part de certains tutoriels sur internet
106. Optimisation du code source PHP -> Petit Jeu Exemple (3) Quelle syntaxe est la plus adaptée ou la plus rapide pour afficher du texte simple ? echo 'KiwiParty' OU echo " KiwiParty " Réponse : La syntaxe echo 'KiwiParty' Pourquoi ? La première syntaxe va demander à l'analyseur PHP de n'effectuer aucun traitement particulier et lui demander d'afficher tel quel le texte. Dans le deuxième cas, l'analyseur de code PHP va rechercher des eventuelles variables, ce qui induit un temps de traitement supérieur Conclusion : mauvaise habitude de la part des développeurs, il faudrait utiliser le plus possible la syntaxe sans recherche de variables et de même, il est fortement recommandé d'écrire de la façon suivante si vous avez des variables à afficher : echo 'Cher ',$username,', vous êtes bien inscrit à la KiwiParty !'
107. Optimisation du code source -> Petit Jeu Exemple (4) Que faut-il préféré entre ces 2 codes ( C'est valable pour tous les langages ) ? $tab = array('1','2','3') ; for($cur = count($tab) ; $cur >=0 ; $cur--) { } OU $nbEltTab = count($tab) ; for($cur = $nbEltTab ; $cur >=0 ; $cur--) { } Réponse : La deuxième écriture Pourquoi ? La première fonction va inutilement faire appel à la fonction count à chaque itération de la boucle for, ce qui fait que l'on consomme des ressources pour rien et que l'on ralentit tout ... Conclusion : certainement de la fainéantise ou bien de l'étourderie de la part des développeurs
108.
109.
110. Dès que l'on a fini d'utiliser une connexion à la base de données, on la ferme le plus tôt possible -> on libère des requêtes pour d'autres clients, on vide les buffers et on attend pas que PHP par exemple le fasse à la fin de la page ( économie de RAM, libération d'un socket ...)
111.
112.
113.
114. Chaque requête d'un visiteur de votre site internet va appeler une requête sur le serveur distant, surtout si vous ne mettez aucun mécanisme de cache