Ecrire et déployer une
appli PHP maintenable

  Christophe Villeneuve   Pierre Couzy
  Consultant PHP          Relation technique FLOSS
  Alter Way               Microsoft




                            7 Février 2012
Pourquoi nous ?

Christophe Villeneuve   Pierre Couzy
Un petit quiz ?

Select * from MaTable order by rand()   Select login from user where id=31

                                        Select password from user
                                                               where id=31

                                        If (password === pwd) select …




Machin = select toto from …             C’est corrigé ?
                                        Oui.
If ! cache(« machin »)                  Testé ?
  Cache(« machin ») = Machin            Oui, la page fonctionne au poil
                                        Bon, on déploie !
blabla
Par où commencer ?
 Les incontournables
     Outils
     Runtime
     Extensions
 Code et dépendances 
     Paramétrage
     Les données
     Les autres points
 La production
     Le serveur
     L’optimisation
     Le cache
     Le déploiement
Les incontournables
Les outils




http://www.flickr.com/photos/fruhjk/5145895601/sizes/z/in/photostream/
Les outils
  Liés avec le système d'exploitation
      Linux, Mac, Windows

  Environnement embarqué (AMP)
      Wampserver, EasyPHP, Xampp, Mampp, WebMatrix

  IDE (Editeurs dits intelligents)
      Eclipse, NetBean, PHPstorm, Zend Studio
          (y a même VS.php pour Visual Studio)
Le runtime
La version de PHP
    PHP 5.2         PHP 5.3 & +
La version de PHP
  L'OS
       Profil de performance différent entre les
       différentes versions PHP
  (5.2 et 5.3 pour windows)

  Impact sur les versions majeures
      Fonctions obsolètes
      Vieux workarounds qui cessent de fonctionner
      Nouveaux bugs

  Impact sur les versions mineures
      Corrections apportées suite à l'analyse par
      CoVerity
      Gestion d'erreurs parfois subtilement différente
PHP 5.4
Comment s'y préparer ?
  Un overview des nouveautés et différences
   Serveur HTTP → php -S localhost:8000
   Les traits
   E_STRICT couvert par error_reporting (E_ALL)

  L'impact sur vos applications
   Evolutions des ARRAYs
   Economie de mémoire en désactivant
 des données venant de $_POST

  L'impact sur windows
Les extensions
Les extensions, c’est facile !
  Calendar : installé ou pas ?

  Mb_string : en mod_php sur 5.2 en mutualisé
  Si l’un active mb_string les autres en 'profitent'

   Si vous ajoutez une extension dans une install existante,
  vous prenez quelle version ?

  La fin du cauchemar sous Windows 
         VC 9 NTS pour IIS
         VC 6 TS (Apache) : NON, stop, laissez tomber !
Extensions
  Installer PHP sans extensions
  Activer le reporting
  Ajouter le strict minimum
  Mettez php.ini au carré




         Ne pas jeter

 Les extensions inutiles
Gestion versions/extensions


Ça reste un problème délicat
phpinfo()
  A vérifier sur la bécane de développement
  et après mise en prod et à garder dans les docs
L'application




OK, peut-être que tout n’est pas écrit en PHP dans cette illustration.
Paramétrage
Le paramétrage




            © symfony
Regrouper les paramètres




           © Wordpress 
A retenir
  Paramètres regroupés

  Différenciés par
  environnement de
  déploiement

  Différenciés par nature
  appli / infra / opti / …

  Préférez des formats texte
  … et documentés

                        © Joomla
Les données
Base de données
 Le minimum
     Une couche technique
 d'abstraction
     Un référentiel pour les
 requêtes custom

 PDO
       Pas complet

  Une parenthèse sur les ORM ?

  NoSQL ?
ORM ou pas ORM ?
 Les gros :
      Doctrine, Propel

 Les petits :
      Micro-ORM
      Kohana, Paris, ADODB

  Vous devez faire un choix :
      Plus c'est gros moins on le comprend
      Quand on choisit un composant, on le supporte
     (on maintient les versions, on suit les patches, etc.)

 Aucun ORM = plein de problèmes
NoSQL  ?
  Pour
     Montée en charge séduisante
     Gestion de déploiement familière
  Contre
       Qui s’y frotte …
 Pour en savoir plus remontez dans le temps
 (session était à 13h00)
Les autres points
Mise à jour
  Page offline pour MAJ
  au lieu de couper le serveur
  et de manger des 404...

  Stratégie de mise à jour
      Séparer les données
      UGC
      Données de structure / modules   / etc

  Exemple : Drupal (un nouveau module)
      Le filesystem
      La base de données
      Même sans contenus utilisateur
      L'upgrade est fait par code
Log,trace,instrumentation ?
   Fichiers auto-générés
   Vignettes
   Sessions
   Paramétrage des logs
      Log errors = on
      Display_errors = off
      E_STRICT (!!)
      E_ALL
      E_DEPRECATED
      E_NOTICE
Sécurité
  5 premiers trous => 86% en 2010
       Injection
       Cross Site Scripting (XSS)
       Violation d'authentification et de session
       Références directes non sécurisées à un objet
       Falsification de requête intersite (CSRF)

  Comment se protéger ?
      Vega (http://subgraph.com)
      PHP Lint (http://www.icosaedro.it/phplint/)
Production & perfs
Montée en charge
Code                               Réseau

Profils de charge inattendus       Temps de réponse plus long

→ Un appel synchrone à FB          → Lag qui passe de 1 à 10 ms
oublié sur la Home Page



Base de données                    Matériel

L'historique est dans la base de   Quelques mégas sur disque,
données
                                   → c'est raisonnable ?
→ Pourquoi la question ?
De CGI à FastCGI
Et ça marche ?




        http://forge.bearstech.com/trac/wiki/DebianLampLenny
Optimisation
  Optimiser c'est mal
      En DEV
      Avant la mise en prod
      Par copier / coller des trucs sur internet
Gestion du cache
  Sur le serveur
      Cache d'opcode
      Cache de résolution dns/filesystem
      User code ?
      Caches de rendu divers et variés
      Cache de Base de données

  Entre bécances
      Session dans APC / Memcache...

  Au cul des bécances
      Varnish / Akamaï (Session de cookie ?)
Le déploiement
Il reste... le déploiement
          SMTP                     FTP / FTPs
 Quelques emails              Pour la mise en prod
 
   Votre hébergeur
                              Exports divers et variés
 Pour du SPAM
 
   Service dédié et externe   Reparamétrage
   (cristend,etc.)

 Outils
 
   SendGrid
 
   Sarbacane
 
   EMailing Automate (EMA)

 En PHP
 
   Emailing
 
   phpList
Conclusion
  Automatiser la chaine de build
     Tout ce qui a été vu avant
     Une passe sur l'analyseur statique de code
     Une passe sur le générateur de doc
     Un rapport et tagger la version dans le contrôleur

  Si vous ne pouvez pas
     Faîtes installer l'application par quelqu'un d'autre
     Ne déranger pas cette personne lors de l'install

  Tout livrer et documenter l'installation
Merci ! Questions ?




                      hellosct1

Ecrire et déployer une appli PHP maintenable

  • 1.
    Ecrire et déployerune appli PHP maintenable Christophe Villeneuve Pierre Couzy Consultant PHP Relation technique FLOSS Alter Way Microsoft 7 Février 2012
  • 2.
  • 3.
    Un petit quiz? Select * from MaTable order by rand() Select login from user where id=31 Select password from user where id=31 If (password === pwd) select … Machin = select toto from … C’est corrigé ? Oui. If ! cache(« machin ») Testé ? Cache(« machin ») = Machin Oui, la page fonctionne au poil Bon, on déploie ! blabla
  • 4.
    Par où commencer ? Les incontournables Outils Runtime Extensions Code et dépendances  Paramétrage Les données Les autres points La production Le serveur L’optimisation Le cache Le déploiement
  • 5.
  • 6.
  • 7.
    Les outils Liés avec le système d'exploitation Linux, Mac, Windows Environnement embarqué (AMP) Wampserver, EasyPHP, Xampp, Mampp, WebMatrix IDE (Editeurs dits intelligents) Eclipse, NetBean, PHPstorm, Zend Studio (y a même VS.php pour Visual Studio)
  • 8.
  • 9.
    La version dePHP PHP 5.2 PHP 5.3 & +
  • 10.
    La version dePHP L'OS Profil de performance différent entre les différentes versions PHP (5.2 et 5.3 pour windows) Impact sur les versions majeures Fonctions obsolètes Vieux workarounds qui cessent de fonctionner Nouveaux bugs Impact sur les versions mineures Corrections apportées suite à l'analyse par CoVerity Gestion d'erreurs parfois subtilement différente
  • 11.
    PHP 5.4 Comment s'ypréparer ? Un overview des nouveautés et différences Serveur HTTP → php -S localhost:8000 Les traits E_STRICT couvert par error_reporting (E_ALL) L'impact sur vos applications Evolutions des ARRAYs Economie de mémoire en désactivant des données venant de $_POST L'impact sur windows
  • 12.
  • 13.
    Les extensions, c’estfacile ! Calendar : installé ou pas ? Mb_string : en mod_php sur 5.2 en mutualisé Si l’un active mb_string les autres en 'profitent' Si vous ajoutez une extension dans une install existante, vous prenez quelle version ? La fin du cauchemar sous Windows  VC 9 NTS pour IIS VC 6 TS (Apache) : NON, stop, laissez tomber !
  • 14.
    Extensions InstallerPHP sans extensions Activer le reporting Ajouter le strict minimum Mettez php.ini au carré Ne pas jeter Les extensions inutiles
  • 16.
  • 17.
    phpinfo() Avérifier sur la bécane de développement et après mise en prod et à garder dans les docs
  • 18.
    L'application OK, peut-être quetout n’est pas écrit en PHP dans cette illustration.
  • 19.
  • 20.
    Le paramétrage © symfony
  • 21.
  • 22.
    A retenir Paramètres regroupés Différenciés par environnement de déploiement Différenciés par nature appli / infra / opti / … Préférez des formats texte … et documentés © Joomla
  • 23.
  • 24.
    Base de données Le minimum Une couche technique d'abstraction Un référentiel pour les requêtes custom PDO Pas complet Une parenthèse sur les ORM ? NoSQL ?
  • 25.
    ORM ou pasORM ? Les gros : Doctrine, Propel Les petits : Micro-ORM Kohana, Paris, ADODB Vous devez faire un choix : Plus c'est gros moins on le comprend Quand on choisit un composant, on le supporte (on maintient les versions, on suit les patches, etc.) Aucun ORM = plein de problèmes
  • 26.
    NoSQL  ? Pour Montée en charge séduisante Gestion de déploiement familière Contre Qui s’y frotte … Pour en savoir plus remontez dans le temps (session était à 13h00)
  • 27.
  • 28.
    Mise à jour Page offline pour MAJ au lieu de couper le serveur et de manger des 404... Stratégie de mise à jour Séparer les données UGC Données de structure / modules / etc Exemple : Drupal (un nouveau module) Le filesystem La base de données Même sans contenus utilisateur L'upgrade est fait par code
  • 29.
    Log,trace,instrumentation ? Fichiers auto-générés Vignettes Sessions Paramétrage des logs Log errors = on Display_errors = off E_STRICT (!!) E_ALL E_DEPRECATED E_NOTICE
  • 30.
    Sécurité 5premiers trous => 86% en 2010 Injection Cross Site Scripting (XSS) Violation d'authentification et de session Références directes non sécurisées à un objet Falsification de requête intersite (CSRF) Comment se protéger ? Vega (http://subgraph.com) PHP Lint (http://www.icosaedro.it/phplint/)
  • 31.
  • 32.
    Montée en charge Code Réseau Profils de charge inattendus Temps de réponse plus long → Un appel synchrone à FB → Lag qui passe de 1 à 10 ms oublié sur la Home Page Base de données Matériel L'historique est dans la base de Quelques mégas sur disque, données → c'est raisonnable ? → Pourquoi la question ?
  • 33.
    De CGI àFastCGI
  • 34.
    Et ça marche ? http://forge.bearstech.com/trac/wiki/DebianLampLenny
  • 35.
    Optimisation Optimiserc'est mal En DEV Avant la mise en prod Par copier / coller des trucs sur internet
  • 36.
    Gestion du cache Sur le serveur Cache d'opcode Cache de résolution dns/filesystem User code ? Caches de rendu divers et variés Cache de Base de données Entre bécances Session dans APC / Memcache... Au cul des bécances Varnish / Akamaï (Session de cookie ?)
  • 37.
  • 38.
    Il reste... ledéploiement SMTP FTP / FTPs Quelques emails Pour la mise en prod  Votre hébergeur Exports divers et variés Pour du SPAM  Service dédié et externe Reparamétrage (cristend,etc.) Outils  SendGrid  Sarbacane  EMailing Automate (EMA) En PHP  Emailing  phpList
  • 39.
    Conclusion Automatiserla chaine de build Tout ce qui a été vu avant Une passe sur l'analyseur statique de code Une passe sur le générateur de doc Un rapport et tagger la version dans le contrôleur Si vous ne pouvez pas Faîtes installer l'application par quelqu'un d'autre Ne déranger pas cette personne lors de l'install Tout livrer et documenter l'installation
  • 40.
    Merci ! Questions? hellosct1