Lucas Bonnet
 Pierre Couzy
◦ Dans le temps

◦ Dans l’environnement d’exécution

◦ Dans les évolutions
   Les prérequis ?
    ◦ Le runtime PHP
    ◦ Les extensions
    ◦ Logging
   L’appli ?
    ◦ Paramétrage
    ◦ La base de données
    ◦ Les autres données
   La prod ?
    ◦ Le serveur
    ◦ Les caches
    ◦ Retour sur la base de données
   Le déploiement
Un premier impact sur les versions majeures
     Fonctions obsolètes
     Vieux workarounds qui cessent de fonctionner
     Nouveaux bugs

Mais aussi sur les versions mineures
     Corrections apportées suite à l’analyse par CoVerity
     Gestion d’erreur parfois subtilement différente
     Exemples : Eval, PDO

Et enfin selon l’OS
     Profil de perf TRES différent entre 5.2 et 5.3 sous Windows

Le choix du runtime va avoir de très grosses conséquences
     Soit on fige une version de PHP en prod
     Soit on sait recetter l’appli sur une nouvelle version de …
   Installez php sans extensions
   Activez le reporting
   Ajoutez le strict minimum
   Mettez php.ini au carré

   Ne jetez pas les extensions
    qui ne vous servent pas ?
    ◦ On est pas d’accord sur le sujet.
   Calendar : installé ou pas ?
   Mb_string : en mod_php sur 5.2 en mutu, si
    des sites activent mb_string les autres en
    “profitent”
   Au fait, quand on ajoute une
    extension à une install existante,
    on prend quelle version ?
   Un cauchemar particulier sous Windows
    ◦ Prenez les versions VC9 NTS pour IIS, et VC6 TS
      pour Apache
   À faire sur la bécane de dev et après chaque
    mise en prod et à garder dans les docs
   Les composants tiers (FW, plugins, etc.)
   Les paramètres de déploiement
   Les paramètres de fonctionnement
   L’adhérence à la base de données
   Le filesystem
   Etc.
   Des 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
   Le minimum syndical
    ◦ Une couche technique d’abstraction
    ◦ Un référentiel pour les requêtes custom

   PDO
    ◦ Pas complet, mais on a pas mieux.

   Une parenthèse sur les ORM
   A votre avis ?

    ◦   Images uploadées
    ◦   Sessions
    ◦   Fichiers auto-générés
    ◦   Logs
    ◦   Code uploadé par un admin (depuis l’IHM Web)
   Quelques questions simples
    ◦   Conventions ?
    ◦   Permissions ?
    ◦   Abstraction ? (wrappers etc)
    ◦   Limites à comprendre
         Nb de fichiers/folders par …
         Limites sur un nom de fichier ?
         Permissions sur répertoires : pas toujours dispo
   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
   Les 5 principales causes couvrent 86% des
    attaques recensées
   Comment se couvrir ?
   Coverity
   Php lint
   Séparez 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 faite par code
   C’est quoi l’adresse de ton SMTP ?
    ◦ Si c’est pour quelques mails l’hébergeur peut
      éventuellement le fournir
    ◦ Si c’est pour spammer on passe par un service
      dédié et externe (critsend, etc.)
   Tu peux m’ouvrir un accès FTP ?
    ◦ Pour de la mise en prod ?
    ◦ Pour de la mise à dispo d’exports divers et variés
    ◦ Pour du reparamétrage
   Profils de charge inattendus
    ◦ Un appel synchrone à FB oublié dans un coin sur la
      home
   La base s’éloigne
    ◦ Lag qui passe de 1 à 10 ms
   Saturations disque / RAM / réseau
   Oui, j’ai laissé l’historique dans la
    base, pourquoi tu demandes ça ?
Un process par                           Chargement de                 Gestion d’un pool




                                                                   FastCGI
                             ISAPI & mod-php
CGI

      requête                                  PHP in-process                de process
                                               (surrogate IIS ou
                                               process Apache)

      Avantage                                 Avantage                      Avantages
      • Très stable                            • Très performant             • Plus rapide que CGI
                                                                             • Plus stable
      Inconvénient                             Inconvénients                   qu’ISAPI/mod_php
                                                                             • Permet de
      • *Très* lent sous                       • Stabilité                     fonctionner sans
        Windows (coût                          • Réentrance                    réentrance
        énorme de création
        d’un process)
http://forge.bearstech.com/trac/wiki/DebianLampLenny
   Optimiser, c’est mal
    ◦ En dev
      Avant la mise en prod
        Par copier/coller de trucs sur internet
   Sur la bécane
    ◦   Cache d’opcode
    ◦   Cache de résolution dns/filesystem
    ◦   User code ?
    ◦   Caches de rendu divers et variés
    ◦   Cache de bdd
   Entre bécanes
    ◦ Sessions dans memcache/redis/..
   Au cul des bécanes
    ◦ Varnish (cookie de session anyone ?)
   Tables à croissance infinie
   Requêtes non cachées
   Requêtes impliquant un table scan
   Select * from MyHugeNewsTable
    … Order by rand()
   Fonctionnellement, une jointure est équivalente à
    une boucle.
   Les BDD savent optimiser les requêtes identiques
    (par exemple les requêtes paramétrées)
    ◦ Il y toujours PDO::ATTR_EMULATE_PREPARES si vous en
      avez besoin
   Mon premier déploiement
    ◦ Coupez le réseau de la machine du développeur et
      filez-lui une clé USB.
   Pour les suivants, automatisez
    ◦ Aujourd’hui ce n’est pas la norme

    … Et on est polis

   Un contrôleur de source ça peut garder plein
    de trucs
    ◦ Y compris une appli qui n’est pas sous contrôle de
      source avant l’arrivée en prod
Développer et déployer une application php maintenable

Développer et déployer une application php maintenable

  • 1.
  • 3.
    ◦ Dans letemps ◦ Dans l’environnement d’exécution ◦ Dans les évolutions
  • 4.
    Les prérequis ? ◦ Le runtime PHP ◦ Les extensions ◦ Logging  L’appli ? ◦ Paramétrage ◦ La base de données ◦ Les autres données  La prod ? ◦ Le serveur ◦ Les caches ◦ Retour sur la base de données  Le déploiement
  • 5.
    Un premier impactsur les versions majeures  Fonctions obsolètes  Vieux workarounds qui cessent de fonctionner  Nouveaux bugs Mais aussi sur les versions mineures  Corrections apportées suite à l’analyse par CoVerity  Gestion d’erreur parfois subtilement différente  Exemples : Eval, PDO Et enfin selon l’OS  Profil de perf TRES différent entre 5.2 et 5.3 sous Windows Le choix du runtime va avoir de très grosses conséquences  Soit on fige une version de PHP en prod  Soit on sait recetter l’appli sur une nouvelle version de …
  • 6.
    Installez php sans extensions  Activez le reporting  Ajoutez le strict minimum  Mettez php.ini au carré  Ne jetez pas les extensions qui ne vous servent pas ? ◦ On est pas d’accord sur le sujet.
  • 7.
    Calendar : installé ou pas ?  Mb_string : en mod_php sur 5.2 en mutu, si des sites activent mb_string les autres en “profitent”  Au fait, quand on ajoute une extension à une install existante, on prend quelle version ?  Un cauchemar particulier sous Windows ◦ Prenez les versions VC9 NTS pour IIS, et VC6 TS pour Apache
  • 9.
    À faire sur la bécane de dev et après chaque mise en prod et à garder dans les docs
  • 10.
    Les composants tiers (FW, plugins, etc.)  Les paramètres de déploiement  Les paramètres de fonctionnement  L’adhérence à la base de données  Le filesystem  Etc.
  • 13.
    Des 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
  • 14.
    Le minimum syndical ◦ Une couche technique d’abstraction ◦ Un référentiel pour les requêtes custom  PDO ◦ Pas complet, mais on a pas mieux.  Une parenthèse sur les ORM
  • 15.
    A votre avis ? ◦ Images uploadées ◦ Sessions ◦ Fichiers auto-générés ◦ Logs ◦ Code uploadé par un admin (depuis l’IHM Web)
  • 16.
    Quelques questions simples ◦ Conventions ? ◦ Permissions ? ◦ Abstraction ? (wrappers etc) ◦ Limites à comprendre  Nb de fichiers/folders par …  Limites sur un nom de fichier ?  Permissions sur répertoires : pas toujours dispo
  • 17.
    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
  • 18.
    Les 5 principales causes couvrent 86% des attaques recensées  Comment se couvrir ?  Coverity  Php lint
  • 19.
    Séparez 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 faite par code
  • 20.
    C’est quoi l’adresse de ton SMTP ? ◦ Si c’est pour quelques mails l’hébergeur peut éventuellement le fournir ◦ Si c’est pour spammer on passe par un service dédié et externe (critsend, etc.)  Tu peux m’ouvrir un accès FTP ? ◦ Pour de la mise en prod ? ◦ Pour de la mise à dispo d’exports divers et variés ◦ Pour du reparamétrage
  • 21.
    Profils de charge inattendus ◦ Un appel synchrone à FB oublié dans un coin sur la home  La base s’éloigne ◦ Lag qui passe de 1 à 10 ms  Saturations disque / RAM / réseau  Oui, j’ai laissé l’historique dans la base, pourquoi tu demandes ça ?
  • 22.
    Un process par Chargement de Gestion d’un pool FastCGI ISAPI & mod-php CGI requête PHP in-process de process (surrogate IIS ou process Apache) Avantage Avantage Avantages • Très stable • Très performant • Plus rapide que CGI • Plus stable Inconvénient Inconvénients qu’ISAPI/mod_php • Permet de • *Très* lent sous • Stabilité fonctionner sans Windows (coût • Réentrance réentrance énorme de création d’un process)
  • 23.
  • 24.
    Optimiser, c’est mal ◦ En dev  Avant la mise en prod  Par copier/coller de trucs sur internet
  • 25.
    Sur la bécane ◦ Cache d’opcode ◦ Cache de résolution dns/filesystem ◦ User code ? ◦ Caches de rendu divers et variés ◦ Cache de bdd  Entre bécanes ◦ Sessions dans memcache/redis/..  Au cul des bécanes ◦ Varnish (cookie de session anyone ?)
  • 26.
    Tables à croissance infinie  Requêtes non cachées  Requêtes impliquant un table scan  Select * from MyHugeNewsTable … Order by rand()  Fonctionnellement, une jointure est équivalente à une boucle.  Les BDD savent optimiser les requêtes identiques (par exemple les requêtes paramétrées) ◦ Il y toujours PDO::ATTR_EMULATE_PREPARES si vous en avez besoin
  • 27.
    Mon premier déploiement ◦ Coupez le réseau de la machine du développeur et filez-lui une clé USB.  Pour les suivants, automatisez ◦ Aujourd’hui ce n’est pas la norme … Et on est polis  Un contrôleur de source ça peut garder plein de trucs ◦ Y compris une appli qui n’est pas sous contrôle de source avant l’arrivée en prod

Notes de l'éditeur

  • #29 Voir comment phpparse ses includes