Christophe VilleneuveConsultant PHP
Alter Way
Ecrire et déployer une appli PHP maintenable
Pierre CouzyRelation technique FLOSS
Microsoft
7 Février 2012
Pourquoi nous ?
Christophe Villeneuve Pierre Couzy
Select login from user where id=31
Select password from user where id=31
If (password === pwd) select …
Machin = select toto from …
If ! cache(« machin ») Cache(« machin ») = Machin
blabla
Un petit quiz ?
Select * from MaTable order by rand()
C’est corrigé ?Oui.Testé ?Oui, la page fonctionne au poilBon, on déploie !
Les incontournablesOutilsRuntimeExtensions
Code et dépendances ParamétrageLes donnéesLes autres points
La productionLe serveurL’optimisationLe cacheLe déploiement
Par où commencer ?
Les incontournables
Les outils
http://www.flickr.com/photos/fruhjk/5145895601/sizes/z/in/photostream/
Les outils
Liés avec le système d'exploitationLinux, 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.3 & +PHP 5.2
La version de PHPL'OS
Profil de performance différent entre les différentes versions PHP (5.2 et 5.3 pour windows)
Impact sur les versions majeuresFonctions obsolètesVieux workarounds qui cessent de fonctionnerNouveaux bugs
Impact sur les versions mineuresCorrections apportées suite à l'analyse par CoVerityGestion d'erreurs parfois subtilement différenteExemples : Eval / PDO
Choix du runtime va avoir de grosses conséquences
Le graal : recetter l'application sur une nouvelle versionLa vraie vie : Figer une version de PHP en prod
PHP 5.4Comment s'y préparer ?
Un overview des nouveautés et différencesServeur HTTP → php -S localhost:8000Les traitsE_STRICT couvert par error_reporting (E_ALL)
L'impact sur vos applicationsEvolutions des ARRAYsEconomie 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 IISVC 6 TS (Apache) : NON, stop, laissez tomber !
ExtensionsInstaller PHP sans extensionsActiver le reportingAjouter le strict minimumMettez 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 retenirParamè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éesLe minimumUne couche technique
d'abstractionUn référentiel pour les
requêtes custom
PDOPas complet
Une parenthèse sur les ORM ?
NoSQL ?
ORM ou pas ORM ?Les gros :
Doctrine, Propel
Les petits :Micro-ORMKohana, Paris, ADODB
Vous devez faire un choix :Plus c'est gros moins on le comprendQuand on choisit un composant, on le supporte (on maintient les versions, on suit les patches, etc.)
Aucun ORM = plein de problèmes
NoSQL ?
PourMontée en charge séduisanteGestion de déploiement familière
ContreQui s’y frotte …
Pour en savoir plus remontez dans le temps
(session était à 13h00)
Les autres points
Mise à jourPage offline pour MAJ
au lieu de couper le serveur et de manger des 404...
Stratégie de mise à jourSéparer les donnéesUGCDonnées de structure / modules / etc
Exemple : Drupal (un nouveau module)Le filesystemLa base de donnéesMême sans contenus utilisateurL'upgrade est fait par code
Log,trace,instrumentation ? Fichiers auto-générés Vignettes Sessions Paramétrage des logs
Log errors = onDisplay_errors = offE_STRICT (!!)E_ALLE_DEPRECATEDE_NOTICE
Sécurité 5 premiers trous => 86% en 2010
InjectionCross Site Scripting (XSS)Violation d'authentification et de sessionRéférences directes non sécurisées à un objetFalsification 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 chargeRéseau
Temps de réponse plus long
→ Lag qui passe de 1 à 10 ms
Base de données
L'historique est dans la base de données
→ Pourquoi la question ?
Code
Profils de charge inattendus
→ Un appel synchrone à FB oublié sur la Home Page
Matériel
Quelques mégas sur disque,
→ c'est raisonnable ?
De CGI à FastCGI
Et ça marche ?
http://forge.bearstech.com/trac/wiki/DebianLampLenny
OptimisationOptimiser c'est malEn DEVAvant la mise en prodPar copier / coller des trucs sur internet
Gestion du cache Sur le serveurCache d'opcodeCache de résolution dns/filesystemUser code ?Caches de rendu divers et variésCache de Base de données
Entre bécancesSession dans APC / Memcache...
Au cul des bécances Varnish / Akamaï (Session de cookie ?)
Le déploiement
Il reste... le déploiement
FTP / FTPsSMTP
Quelques emails Votre hébergeur
Pour du SPAMService dédié et externe (cristend,etc.)
OutilsSendGridSarbacaneEMailing Automate (EMA)
En PHP EmailingphpList
Pour la mise en prod
Exports divers et variés
Reparamétrage
Conclusion Automatiser la chaine de build
Tout ce qui a été vu avantUne passe sur l'analyseur statique de codeUne passe sur le générateur de docUn rapport et tagger la version dans le contrôleur
Si vous ne pouvez pasFaîtes installer l'application par quelqu'un d'autreNe déranger pas cette personne lors de l'install
Tout livrer et documenter l'installation
Merci ! Questions ?
hellosct1