Ecrire et déployer une appli PHP maintenable

Preview:

DESCRIPTION

Conférence 'Ecrire et déployer une appli PHP maintenable' présentée au TechDays 2012 à Paris par Christophe Villeneuve et Pierre Couzy

Citation preview

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 outilsLié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 PHPPHP 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équencesLe 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:8000→Les 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 minimum

Une couche technique d'abstraction

Un 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  ?Pour

Monté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 mal

En DEVAvant la mise en prodPar copier / coller des trucs sur internet

Gestion du cache Sur le serveur

Cache 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éploiementFTP / FTPsSMTP

Quelques emails Votre hébergeur

Pour du SPAM Service dédié et externe

(cristend,etc.)

Outils SendGrid Sarbacane EMailing Automate (EMA)

En PHP Emailing phpList

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