SlideShare une entreprise Scribd logo
1  sur  36
Optimisation et sécurisation du code de PrestaShop
[object Object]
Équipe de 6 développeurs & intégrateurs
400 PrestaShop installés – versions de 0.9.6 a 1.3.1
Hébergementmutualisé – cluster de 10+ machines (load balancers, serveurs web, serveurs de fichiers, serveurs de bdd) A propos de nous ?
Les 4 pilliers de la performance ,[object Object]
Focus sur : Code côtéserveur (1ère couche, PHP + SQL)
Réseau, protocolede transport
Code côté client (2eme couche: HTML+ CSS + Javascript),[object Object]
[object Object]
Vousdevez coder en utilisant les meilleurespratiques(ne pas faire de choses stupides ;))
Préférezplutôt la  "maintabilité" et la lisibilité du code aux performances
Lorsquela performance n'estpas critique (ex. systèmes temps réel, sites à fort trafic), vouspourrezl'améliorerdansdes versions ultérieuresQuand faut-il optimiser ?
[object Object]
Mesurezdifférents scénarii et configurations
Passer sous Linux? Test Linux, non Win. => différences
Aurez-vous plus de 10000 produits? Tester votre module avec une base de 10000 élémentset non 5
Est-ceque 1% d'amélioration justifie un travail additionnel?
Et 5%? 10%?
Essayez  d'estimer le coût de développement vs. coûtmatériel : parfoisc'est moins cherd'ajouter de la mémoire viveQuand faut-il optimiser ?
Les petits gains de performance En utilisant (int) au lieu de intval () estpeutêtre 4x plus rapidemaisle gain global estnégligeable (saufsivousêtesFacebook) ,[object Object],Tools::setCookieLanguagepourraitêtreaméliorée, maisellen'estexécutéequ'uneseulefois ,[object Object],Mais”$a $b $c” … est plus rapideque $a.” ”.$b.” ”.$c  Qu'est-ce qu'il n'est pas nécessaire d'optimiser ?
Charge serveur: ab, siege, multi-mechanize ... Charge de la base de donnée: MySql Slow Query Log, mysql proxy, ... EXPLAIN  PHP: xdebug, dbg, xhprof ... Network / client side Yslow, Firebug, WebKitinspector, dynaTrace AJAX, fiddler, Google webmaster tools Comment mesurer ?
Serveur: Tâchedifficile, voire impossible sur des hébergementsmutualisés Demandez à votre admin sys ;) Le CPU est rarement un point critique, il indique généralement des problèmes avec le code non-optimisé La RAM est bon marché mais pas illimitée - attention à la consommation de mémoire des scripts ,[object Object]
Ramdisk pour les fichierssouventappelés (frameworks, configuration, tmp) Le point généralement critique: I/O (filesystem, dbs) Amélioration de l’infrastructure
Chaque appel aux fichiers a un coût qui dépend de l'OS, du système de fichiers et du nombre de fichiers Toujoursutiliser des cheminsabsolusdans require/ include ,[object Object]
Chaqueproduit a une image, chaque image a 6 vignettes
Debian+ Apache 1.3 (hébergement mutualisé, nfs):Système de fichiers # Files Glob('*') exec. in sec. file_exists / sec. 1000 4,59 36000 11000 13,30 21000 65000 55,81 1475 122000 142,16 718
Fractionnement du contenu des répertoires img/p/534-189-small.jpg 	devient  img/p/small/534-189.jpg Lecture transparente avec un  .htaccess RewriteRule (.*)/p/([^/]*)homejpg $1/p/home/$2home.jpg Ecriture transparente en php  	if (!imageResize($file, 				$dir.$imageType['name'].'/'.$language['iso_code'].'-default-	'.stripslashes($imageType['name']).'.jpg', ... Solution
Base de donnée ,[object Object]
Attention aux jointures!SELECT * FROM ps_feature` f LEFT JOIN ps_feature_lang` fl ON ( f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = 1) WHERE f.`id_feature` = 1SELECT * FROM ps_feature_lang` fl WHER fl.`id_feature` = 1 AND fl.`id_lang` = 1  Version Tables Columns Without index 1.1.0.5 88 458 50 1.2.0.5 134 670 50 1.3.10 135 679 2 (cool! :)
Utilisez des VIEWs à la place de SELECTs compliqués Avezvousbesoin de ps_connections& ps_connections_page? Si vousavez un traficconséquent, celles-cipeuventgrossir de plus de 10+ Mb / jour Base de donnée
[object Object],1.3.10, simulation du processus de commande: Index – recherche – connexion – commande(11 pages au total) 3001 requêtes SQL, maisseulement 1314 uniques! (44%)  PHP - SQL
Requêtes répétées
Requêtes non optimisées
[object Object]
Utiliserun cache en interne:Peutêtreplacé en local ou global ,[object Object]

Contenu connexe

Tendances

DrupalCamp Lyon 2012 - Optimiser les performances Drupal depuis les tranchées
DrupalCamp Lyon 2012 -  Optimiser les performances Drupal depuis les tranchéesDrupalCamp Lyon 2012 -  Optimiser les performances Drupal depuis les tranchées
DrupalCamp Lyon 2012 - Optimiser les performances Drupal depuis les tranchéesAurelien Navarre
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaPatrick Allaert
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheAurelien Navarre
 
Optimiser WordPress
Optimiser WordPressOptimiser WordPress
Optimiser WordPressChi Nacim
 
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8Aurelien Navarre
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linuxKhalid ALLILI
 
Votre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodVotre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodCéline Louvet
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Fabien Arcellier
 
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...Aurelien Navarre
 
Google App Engine For Java
Google App Engine For JavaGoogle App Engine For Java
Google App Engine For Javatcouery
 
Comment se charge WordPress ? Le loading du core.
Comment se charge WordPress ? Le loading du core.Comment se charge WordPress ? Le loading du core.
Comment se charge WordPress ? Le loading du core.Boiteaweb
 
[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...
[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...
[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...Microsoft Technet France
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 

Tendances (20)

DrupalCamp Lyon 2012 - Optimiser les performances Drupal depuis les tranchées
DrupalCamp Lyon 2012 -  Optimiser les performances Drupal depuis les tranchéesDrupalCamp Lyon 2012 -  Optimiser les performances Drupal depuis les tranchées
DrupalCamp Lyon 2012 - Optimiser les performances Drupal depuis les tranchées
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
 
Optimiser wordpress
Optimiser wordpressOptimiser wordpress
Optimiser wordpress
 
Optimiser WordPress
Optimiser WordPressOptimiser WordPress
Optimiser WordPress
 
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linux
 
Des tests modernes pour Drupal
Des tests modernes pour DrupalDes tests modernes pour Drupal
Des tests modernes pour Drupal
 
Dynamic Languages
Dynamic LanguagesDynamic Languages
Dynamic Languages
 
Votre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodVotre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prod
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
 
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
 
Ansib formation-ansible
Ansib formation-ansibleAnsib formation-ansible
Ansib formation-ansible
 
Google App Engine For Java
Google App Engine For JavaGoogle App Engine For Java
Google App Engine For Java
 
REX Ansible
REX AnsibleREX Ansible
REX Ansible
 
Wds procedure
Wds procedureWds procedure
Wds procedure
 
Comment se charge WordPress ? Le loading du core.
Comment se charge WordPress ? Le loading du core.Comment se charge WordPress ? Le loading du core.
Comment se charge WordPress ? Le loading du core.
 
[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...
[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...
[Tuto] Sql backup : Comment sauvegarder une base de données SQL Server dans l...
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 

Similaire à Performance et optimisation de PrestaShop

Kiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetKiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetDevclic
 
Ecrire et déployer une appli PHP maintenable
Ecrire et déployer une appli PHP maintenableEcrire et déployer une appli PHP maintenable
Ecrire et déployer une appli PHP maintenableChristophe Villeneuve
 
JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)Fourat Zouari
 
Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv PsGregory Renard
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptMichael Akbaraly
 
Webinar Smile : Comment industrialiser votre SI avec Ansible ?
Webinar Smile : Comment industrialiser votre SI avec Ansible ?Webinar Smile : Comment industrialiser votre SI avec Ansible ?
Webinar Smile : Comment industrialiser votre SI avec Ansible ?Smile I.T is open
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Jean Gabès
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
Memcached, une solution de cache par excellence
Memcached, une solution de cache par excellenceMemcached, une solution de cache par excellence
Memcached, une solution de cache par excellenceMehdi Mehni
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !matparisot
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Mathieu Parisot
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
Power shell saturday Paris 2017 Omiossec
Power shell saturday  Paris 2017 OmiossecPower shell saturday  Paris 2017 Omiossec
Power shell saturday Paris 2017 OmiossecOlivier Miossec
 

Similaire à Performance et optimisation de PrestaShop (20)

Kiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetKiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internet
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Ecrire et déployer une appli PHP maintenable
Ecrire et déployer une appli PHP maintenableEcrire et déployer une appli PHP maintenable
Ecrire et déployer une appli PHP maintenable
 
JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)JBoss clustering et tuning (lab 3/3)
JBoss clustering et tuning (lab 3/3)
 
Retour d'expérience sur PowerShell
Retour d'expérience sur PowerShellRetour d'expérience sur PowerShell
Retour d'expérience sur PowerShell
 
Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv Ps
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Webinar Smile : Comment industrialiser votre SI avec Ansible ?
Webinar Smile : Comment industrialiser votre SI avec Ansible ?Webinar Smile : Comment industrialiser votre SI avec Ansible ?
Webinar Smile : Comment industrialiser votre SI avec Ansible ?
 
Cours Php
Cours PhpCours Php
Cours Php
 
Cours Php
Cours PhpCours Php
Cours Php
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Memcached, une solution de cache par excellence
Memcached, une solution de cache par excellenceMemcached, une solution de cache par excellence
Memcached, une solution de cache par excellence
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !
 
Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !Développez dans le futur, dès maintenant !
Développez dans le futur, dès maintenant !
 
Mysql
MysqlMysql
Mysql
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Power shell saturday Paris 2017 Omiossec
Power shell saturday  Paris 2017 OmiossecPower shell saturday  Paris 2017 Omiossec
Power shell saturday Paris 2017 Omiossec
 

Plus de PrestaShop

Réussir l'internationalisation de sa boutique e-commerce
Réussir l'internationalisation de sa boutique e-commerceRéussir l'internationalisation de sa boutique e-commerce
Réussir l'internationalisation de sa boutique e-commercePrestaShop
 
PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !
PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !
PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !PrestaShop
 
Bc3 atelier new_quest
Bc3 atelier new_questBc3 atelier new_quest
Bc3 atelier new_questPrestaShop
 
Barcamp 3 PrestaShop - Atelier Découverte de So-Colissimo
Barcamp 3 PrestaShop - Atelier Découverte de So-ColissimoBarcamp 3 PrestaShop - Atelier Découverte de So-Colissimo
Barcamp 3 PrestaShop - Atelier Découverte de So-ColissimoPrestaShop
 
Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4
Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4
Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4PrestaShop
 
Barcamp 3 PrestaShop - Atelier Intégration
Barcamp 3 PrestaShop - Atelier IntégrationBarcamp 3 PrestaShop - Atelier Intégration
Barcamp 3 PrestaShop - Atelier IntégrationPrestaShop
 
Barcamp 3 PrestaShop - Atelier PrestaShop / eBay
Barcamp 3 PrestaShop - Atelier PrestaShop / eBayBarcamp 3 PrestaShop - Atelier PrestaShop / eBay
Barcamp 3 PrestaShop - Atelier PrestaShop / eBayPrestaShop
 
Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...
Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...
Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...PrestaShop
 
Barcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commande
Barcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commandeBarcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commande
Barcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commandePrestaShop
 
Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !
Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !
Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !PrestaShop
 
Barcamp 3 PrestaShop - Ouverture
Barcamp 3 PrestaShop - OuvertureBarcamp 3 PrestaShop - Ouverture
Barcamp 3 PrestaShop - OuverturePrestaShop
 
Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...
Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...
Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...PrestaShop
 
Barcamp 3 PrestaShop - Témoignage Office Depot
Barcamp 3 PrestaShop - Témoignage Office DepotBarcamp 3 PrestaShop - Témoignage Office Depot
Barcamp 3 PrestaShop - Témoignage Office DepotPrestaShop
 
Barcamp 3 PrestaShop - Conférence Réseaux Sociaux - Locita
Barcamp 3 PrestaShop - Conférence Réseaux Sociaux - LocitaBarcamp 3 PrestaShop - Conférence Réseaux Sociaux - Locita
Barcamp 3 PrestaShop - Conférence Réseaux Sociaux - LocitaPrestaShop
 
Barcamp 3 PrestaShop - Conférence Blog-Ecommerce
Barcamp 3 PrestaShop - Conférence Blog-EcommerceBarcamp 3 PrestaShop - Conférence Blog-Ecommerce
Barcamp 3 PrestaShop - Conférence Blog-EcommercePrestaShop
 
Installation & Configuration - PrestaShop
Installation & Configuration - PrestaShopInstallation & Configuration - PrestaShop
Installation & Configuration - PrestaShopPrestaShop
 
Créer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShopCréer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShopPrestaShop
 
Good practices for PrestaShop code security and optimization
Good practices for PrestaShop code security and optimizationGood practices for PrestaShop code security and optimization
Good practices for PrestaShop code security and optimizationPrestaShop
 
Sécurité et performance, comment bien optimiser PrestaShop
Sécurité et performance, comment bien optimiser PrestaShopSécurité et performance, comment bien optimiser PrestaShop
Sécurité et performance, comment bien optimiser PrestaShopPrestaShop
 
Retour sur la version 1.3 de PrestaShop
Retour sur la version 1.3 de PrestaShopRetour sur la version 1.3 de PrestaShop
Retour sur la version 1.3 de PrestaShopPrestaShop
 

Plus de PrestaShop (20)

Réussir l'internationalisation de sa boutique e-commerce
Réussir l'internationalisation de sa boutique e-commerceRéussir l'internationalisation de sa boutique e-commerce
Réussir l'internationalisation de sa boutique e-commerce
 
PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !
PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !
PrestaShop v.1.5 Alpha 1 : découvrez le Multi-boutique !
 
Bc3 atelier new_quest
Bc3 atelier new_questBc3 atelier new_quest
Bc3 atelier new_quest
 
Barcamp 3 PrestaShop - Atelier Découverte de So-Colissimo
Barcamp 3 PrestaShop - Atelier Découverte de So-ColissimoBarcamp 3 PrestaShop - Atelier Découverte de So-Colissimo
Barcamp 3 PrestaShop - Atelier Découverte de So-Colissimo
 
Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4
Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4
Barcamp 3 PrestaShop - Atelier Découverte de PrestaShop v.1.4
 
Barcamp 3 PrestaShop - Atelier Intégration
Barcamp 3 PrestaShop - Atelier IntégrationBarcamp 3 PrestaShop - Atelier Intégration
Barcamp 3 PrestaShop - Atelier Intégration
 
Barcamp 3 PrestaShop - Atelier PrestaShop / eBay
Barcamp 3 PrestaShop - Atelier PrestaShop / eBayBarcamp 3 PrestaShop - Atelier PrestaShop / eBay
Barcamp 3 PrestaShop - Atelier PrestaShop / eBay
 
Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...
Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...
Barcamp 3 PrestaShop - Découvrez le webservice et la version mobile de Presta...
 
Barcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commande
Barcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commandeBarcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commande
Barcamp 3 PrestaShop - Conférence Ergonomie et Tunnel de commande
 
Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !
Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !
Barcamp 3 PrestaShop - PrestaShop v.1.5 se dévoile !
 
Barcamp 3 PrestaShop - Ouverture
Barcamp 3 PrestaShop - OuvertureBarcamp 3 PrestaShop - Ouverture
Barcamp 3 PrestaShop - Ouverture
 
Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...
Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...
Barcamp 3 PrestaShop - Conférence Optimisations et Hébergement de votre site ...
 
Barcamp 3 PrestaShop - Témoignage Office Depot
Barcamp 3 PrestaShop - Témoignage Office DepotBarcamp 3 PrestaShop - Témoignage Office Depot
Barcamp 3 PrestaShop - Témoignage Office Depot
 
Barcamp 3 PrestaShop - Conférence Réseaux Sociaux - Locita
Barcamp 3 PrestaShop - Conférence Réseaux Sociaux - LocitaBarcamp 3 PrestaShop - Conférence Réseaux Sociaux - Locita
Barcamp 3 PrestaShop - Conférence Réseaux Sociaux - Locita
 
Barcamp 3 PrestaShop - Conférence Blog-Ecommerce
Barcamp 3 PrestaShop - Conférence Blog-EcommerceBarcamp 3 PrestaShop - Conférence Blog-Ecommerce
Barcamp 3 PrestaShop - Conférence Blog-Ecommerce
 
Installation & Configuration - PrestaShop
Installation & Configuration - PrestaShopInstallation & Configuration - PrestaShop
Installation & Configuration - PrestaShop
 
Créer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShopCréer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShop
 
Good practices for PrestaShop code security and optimization
Good practices for PrestaShop code security and optimizationGood practices for PrestaShop code security and optimization
Good practices for PrestaShop code security and optimization
 
Sécurité et performance, comment bien optimiser PrestaShop
Sécurité et performance, comment bien optimiser PrestaShopSécurité et performance, comment bien optimiser PrestaShop
Sécurité et performance, comment bien optimiser PrestaShop
 
Retour sur la version 1.3 de PrestaShop
Retour sur la version 1.3 de PrestaShopRetour sur la version 1.3 de PrestaShop
Retour sur la version 1.3 de PrestaShop
 

Performance et optimisation de PrestaShop

  • 1. Optimisation et sécurisation du code de PrestaShop
  • 2.
  • 3. Équipe de 6 développeurs & intégrateurs
  • 4. 400 PrestaShop installés – versions de 0.9.6 a 1.3.1
  • 5. Hébergementmutualisé – cluster de 10+ machines (load balancers, serveurs web, serveurs de fichiers, serveurs de bdd) A propos de nous ?
  • 6.
  • 7. Focus sur : Code côtéserveur (1ère couche, PHP + SQL)
  • 9.
  • 10.
  • 11. Vousdevez coder en utilisant les meilleurespratiques(ne pas faire de choses stupides ;))
  • 12. Préférezplutôt la  "maintabilité" et la lisibilité du code aux performances
  • 13. Lorsquela performance n'estpas critique (ex. systèmes temps réel, sites à fort trafic), vouspourrezl'améliorerdansdes versions ultérieuresQuand faut-il optimiser ?
  • 14.
  • 16. Passer sous Linux? Test Linux, non Win. => différences
  • 17. Aurez-vous plus de 10000 produits? Tester votre module avec une base de 10000 élémentset non 5
  • 20. Essayez  d'estimer le coût de développement vs. coûtmatériel : parfoisc'est moins cherd'ajouter de la mémoire viveQuand faut-il optimiser ?
  • 21.
  • 22. Charge serveur: ab, siege, multi-mechanize ... Charge de la base de donnée: MySql Slow Query Log, mysql proxy, ... EXPLAIN PHP: xdebug, dbg, xhprof ... Network / client side Yslow, Firebug, WebKitinspector, dynaTrace AJAX, fiddler, Google webmaster tools Comment mesurer ?
  • 23.
  • 24. Ramdisk pour les fichierssouventappelés (frameworks, configuration, tmp) Le point généralement critique: I/O (filesystem, dbs) Amélioration de l’infrastructure
  • 25.
  • 26. Chaqueproduit a une image, chaque image a 6 vignettes
  • 27. Debian+ Apache 1.3 (hébergement mutualisé, nfs):Système de fichiers # Files Glob('*') exec. in sec. file_exists / sec. 1000 4,59 36000 11000 13,30 21000 65000 55,81 1475 122000 142,16 718
  • 28. Fractionnement du contenu des répertoires img/p/534-189-small.jpg devient img/p/small/534-189.jpg Lecture transparente avec un .htaccess RewriteRule (.*)/p/([^/]*)homejpg $1/p/home/$2home.jpg Ecriture transparente en php  if (!imageResize($file, $dir.$imageType['name'].'/'.$language['iso_code'].'-default- '.stripslashes($imageType['name']).'.jpg', ... Solution
  • 29.
  • 30. Attention aux jointures!SELECT * FROM ps_feature` f LEFT JOIN ps_feature_lang` fl ON ( f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = 1) WHERE f.`id_feature` = 1SELECT * FROM ps_feature_lang` fl WHER fl.`id_feature` = 1 AND fl.`id_lang` = 1 Version Tables Columns Without index 1.1.0.5 88 458 50 1.2.0.5 134 670 50 1.3.10 135 679 2 (cool! :)
  • 31. Utilisez des VIEWs à la place de SELECTs compliqués Avezvousbesoin de ps_connections& ps_connections_page? Si vousavez un traficconséquent, celles-cipeuventgrossir de plus de 10+ Mb / jour Base de donnée
  • 32.
  • 35.
  • 36.
  • 37. Simple à implémenter, à régler et .... à oublier
  • 38. Chaqueméthode/classedoitmettre en cache sespropresrequêtesSolutions
  • 39. static public function getCurrency($id_currency){ return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'currency` WHERE `deleted` = 0 AND `id_currency` = '.intval($id_currency)); } static public functiongetCurrency($id_currency){ if (!isset(self::$_cache[$id_currency])) { self::$_cache[$id_currency] = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'currency` WHERE `deleted` = 0 AND `id_currency` = '.intval($id_currency)); } return self::$_cache[$id_currency]; } Cache local
  • 40.
  • 45. Uneunique implémentation rend la maintenance du code plus simple
  • 47.
  • 48.
  • 49. foreach($cart->getProducts() as $product)    if ($orderStatus->logable)       ProductSale::addProductSale(intval($product['id_product']), intval($product['cart_quantity'])); Devraitêtre: if ($orderStatus->logable)      foreach($cart->getProducts() as $product)             ProductSale::addProductSale(intval($product['id_product']), intval($product['cart_quantity'])); (pas utile de tester le if  à chaqueitérations'iln'y a pas de changement) Bien placer les conditions
  • 50. // Send an e-mail to customer if ($id_order_state!= _PS_OS_ERROR_ AND $id_order_state!= _PS_OS_CANCELED_ AND $customer->id) { $invoice = new Address(intval($order->id_address_invoice)); $delivery = new Address(intval($order->id_address_delivery)); $carrier = new Carrier(intval($order->id_carrier)); $delivery_state= $delivery->id_state ? new State(intval($delivery->id_state)) : false; $invoice_state= $invoice->id_state ? new State(intval($invoice->id_state)) : false; $data = array( '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{delivery_company}' => $delivery->company, '{delivery_firstname}' => $delivery->firstname, '{delivery_lastname}' => $delivery->lastname, '{delivery_address1}' => $delivery->address1, '{delivery_address2}' => $delivery->address2, '{delivery_city}' => $delivery->city, '{delivery_postal_code}' => $delivery->postcode, '{delivery_country}' => $delivery->country, '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', '{delivery_phone}' => $delivery->phone, '{delivery_other}' => $delivery->other, '{invoice_company}' => $invoice->company, '{invoice_firstname}' => $invoice->firstname, '{invoice_lastname}' => $invoice->lastname, '{invoice_address2}' => $invoice->address2, '{invoice_address1}' => $invoice->address1, '{invoice_city}' => $invoice->city, '{invoice_postal_code}' => $invoice->postcode, '{invoice_country}' => $invoice->country, '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', '{invoice_phone}' => $invoice->phone, '{invoice_other}' => $invoice->other, {order_name}' => sprintf("#%06d", intval($order->id)), '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), intval($order->id_lang), 1), '{carrier}' => (strval($carrier->name) != '0' ? $carrier->name : Configuration::get('PS_SHOP_NAME')), '{payment}' => $order->payment, Voyezvous le problème ?
  • 51. '{products}' => $productsList, '{discounts}' => $discountsList, '{total_paid}' => Tools::displayPrice($order->total_paid, $currency, false, false), '{total_products}' => Tools::displayPrice($order->total_paid - $order->total_shipping - $order->total_wrapping + $order->total_discounts, $currency, false, false), '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency, false, false), '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency, false, false), '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency, false, false)); if (is_array($extraVars)) $data = array_merge($data, $extraVars); // Join PDF invoice if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number) { $fileAttachment['content'] = PDF::invoice($order, 'S'); $fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf'; $fileAttachment['mime'] = 'application/pdf'; } else $fileAttachment= NULL; if ($orderStatus->send_email AND Validate::isEmail($customer->email)) Mail::Send(intval($order->id_lang), 'order_conf', 'Order confirmation', $data, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, $fileAttachment); $this->currentOrder = intval($order->id); return true; } $this->currentOrder = intval($order->id); return true;
  • 52. Ici, on prépare tout l'envoi du mail avec le pdf en pièce jointemêmesi on ne l'envoie pas. “Every times you do it, a little kitten dies” Conditions non optimisés
  • 53.
  • 54. Pour le flux BeezUP, nous utilisonsObjectModel
  • 55. Celafonctionnemais nous avons 17 requêtes SQL par produitpour collectertoutes les informations (product, features, attributes, images...)
  • 56. Ok pour 100 produits,... et pour 100 000 ?
  • 57. Risqué sil’ondoit le générersurdemande
  • 58. La tâcheCronprépare le fichieravantque le robot n'yaccède
  • 59. Le robot accède au xml en cacheUtilisez un CRON pour générer le cache
  • 60.
  • 61. Pour du contenustatique, utilisezmod_gzip/ mod_deflate
  • 63.
  • 64.
  • 65. Utilisez le cache (mod_expires, Etags) pour les fichiersstatiquescomme les imagesVouspouvez le faire dans un .htaccessoudanshttpd.conf ExpiresActiveOn ExpiresDefault"access plus 15 days“ ExpiresByTypeimage/gif A2592000 Réseau
  • 66.
  • 67. Jqueryn'est pas toujours plus rapide.Utilisez des méthodes natives
  • 68. Evitezd’utiliser du HTML / XML en résultat AJAX; utilisezplutôt du JSON. Vouspouvezréduire la quantité de données de l'ordre de 75%!Coté client
  • 69. Botnets Concurrents malhonnêtes Acheteurs frauduleux … Pourquoi se protéger ?
  • 70. Injection SQL CSRF XSS Path transversal … Differents types d’attaque
  • 71. Permet d’intéragir avec la base de donnée Sécuriseztoutesvos variables avantl’utilisationdans des requêtes SQL!<?php ...... $order_detail = Db::getInstance()->ExecuteS(' SELECT * FROM .'_DB_PREFIX_.'order_detail WHERE id_order='.(int)$_GET['id_order'] AND payment=apos;'.pSQL($_GET['payment']).'apos;'); Injection SQL
  • 72. Exploite votre identité auprès de votre site Utilisez des tokens Utilisezuneauthentificationdans les paramètres GET ou POST index.php?tab=AdminOrders&token=e84b3fda0b04b922b3bc27b08d4fe136 CSRF
  • 73. Injection de code HTML / JavaScript dans la page Sécuriseztoutesvos variables avantl’affichage! <input type="text" name="lastname" value="{$smarty.post.lastname|htmlentities}" /> preg_replace('/.*script/ui', '', $_POST['lastname']); preg_replace('/.*onmousedown|onmousemove|onmmouseup|onmouseover|onmouseout|onload|onunload|onfocus|onblur|onchange|onsubmit|ondblclick|onclick|onkeydown|onkeyup|onkeypress|onmouseenter|onmouseleave/ui', '', $_POST['lastname']); ... XSS
  • 74. Accès à des données non autorisées Sécuriseztoutesvos variables avant de charger le fichier Vérifiezl’extention du fichier include (dirname(__FILE__).'/mails/'. preg_replace(‘/{2,}/', '.', Tools::getValue('mail')).'html'); Path transversal