Confoo 2011SaadTazi
Au programme…Symfony2Caching, ESIAutresinformationsConfooDes questions? Quandvousvoulez!
Introduction“Un autre framework MVC PHP (encore??)”Batiàpartir de composantsréutilisables (Yaml, Dependency Injection Container, Twig…)Full-stack framework (pas micro – voirsilex)
Différence avec symfony 1EntièrementréécritBeaucoup d’apprentissage avec symfony 1 => meilleurepratiquedansSymfony 2Pas de séparation entre plusieursappsSupprime les problèmes de routing entre applicationsmaisen bundle sinécessaireCaching HTTP (on va en parlerjuste après…)Utilisation des namespace php 5.3Mon “feeling”: courbed’apprentissage plus importante, moins de “magie”, beaucoup plus de Design Patterns appliqués (DIC, decoupling…)
Introductionhttp://symfony.comQui a travaillé avec symfony (1)? Un autre framework PHP?
Une image vaut 1000 mots…Structure de Symfony (code)
Structure
StructureEst-cequej’aiparlé de:ConfigRoutingVendorsSwiftmailerDoctrine 2Monolog (et non Zend)
De la requêteà la réponseUnerequêteestreçue par le front controller de SymfonyLe routing déterminequelle action estappeléeL’actionestexécutéeL’actionretourneuneréponseEn un mot, Symfonyest en charge de convertirunerequête en réponse.
Front ControllerTrès simple
Touterequêtepasse par le front controllerroutingUnerequêteestreçue par le front controller de SymfonyLe routing déterminequelle action estappeléeL’actionestexécutéeL’actionretourneuneréponseEn un mot, Symfonyest en charge de convertirunerequête en réponse.
Routing (2)Dans app/config/routing.yml:DansDemoController.php:Routing (3)Diffrérentesapprochespossibles (combinées)YamlPhpAnnotationXmlAvantage par rapport àSymfony 1Plus flexibleInclusion de règlesexternes(Bundles… slide suivantes)
BundlesUn bundle est un répertoire avec une structure prédéfinie, qui contient des classes, des controlleurs, des templates et des ressources (images, css…), des règles de routingRemplace les plugins… mais en plus génériqueConfiguration, routing par bundle possible
ActionUnerequêteestreçue par le front controller de SymfonyLe routing déterminequelle action estappeléeL’actionestexécutéeL’actionretourneuneréponseEn un mot, Symfonyest en charge de convertirunerequête en réponse.
Action (2)Le C du MVCOu (plus “verbose”):return $this->render(’EcmaBundle:Demo:hello.twig', array('name' => $name));
TwigLe V du MVCTemplate engineInspiré de Jinja, template engine PythonRapide, car compilé en PHPSupportel’héritagePas obligatoire avec Symfony 2
Twig (2)(asset, block title (défaut), block content, extends)
D’autresfonctionnalités…
Web Debug ToolbarSimilaireà la debug toolbar de symfony 1Activable par environnement (dev, prod…)
Profiler
Console
Doctrine 2Le M du MVC (“enfin!”)ORM / ODM au dessus de PDOData Mapper Design Pattern au lieu de Active RecordPas nécessaireque les Classes Modèleshéritentd’uneclasse parentUneclasse qui s’occupe de faire les actions DB (Mapper - classegénéréeautomatiquement)Support de MongoDB (ODM) et CouchDB et…
Doctrine 2 (2)Annotation, XML, YAML pour définir les Entités (= les classes Modèles)
TestsPHPUnit +classeWebTestCase + le Crawler ComponentPermet de:simuler des requêtes HTTP, Faire des “back”,  Soumettre des formulaires…http://symfony.com/doc/2.0/book/testing.html#the-test-client
Tests (2)
CacheGET (Etag, ...)Cache existe? valide?NONOUI
But: ne pas “frapper” le serveur Web àchaqueappelHTTP RFC 2616 CompliantExpirationExpires=DateSurtout pour ce qui eststatique (synchronisation)Cache-control: Maxage=20, s-maxage=20 (seconds)ValidationEtag / if none matchLast-modified / if modified sinceInséré par le cache (retourne un 304 not modified)Cache (2)
Cache (3)Front Controller:Sans cacheAvec cache
DansSymfony2La classeAppCachepeutavoir les headers par défautChaque action peut (re)définirles “headers de cache”On peut “wrapper” le framework par un système de cache PHP (pour tester)On peututiliser Varnish ouAkamaiou NGINX comme reverse Proxy (ou Cache Proxy) en avant du serveur WebMais comment mettre en cache le “welcome User 1” dans le header par exemple?...Cache (4)
ESI: Edge Side IncludeLe reverse proxy fait un appel si nécessaireAvec Symfony2: un helper:Cache (5)
Framework moderne, flexible, puissantdynamise la communauté PHPDoctine 2Symfony ComponentDependency InjectionTwigMonologSilex (à la Sinatra ou nodejs…)http://groups.google.com/group/php-standards/web/psr-0-final-proposalDocumentation: bonne, mais manque un jobeetStabilité: en pre-releasedepuis quelques temps…(j’ai omis le Formframework pour une raison…)(les dernières nouvelles…)En résumé
Et le reste de confoo?
HTML5Trèsprésent, mêmesi on utilise HTML5 pour plus…LibrairieJavascript, SVG, …Nombreusesconférences, de Mozilla, Microsoft…Quoi faire avec les anciens browsers:Polyfillshttps://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-PolyfillsQuelséléments HTML5 sont “production ready”Video http://craftymind.com/factory/html5video/CanvasVideo.htmllocalStorageWebSocket (lien avec Nodejs plus loin ;-))File APISVG, Canvas…	Pas prêtEmbedDBDrag & Drop…
Server-Side JavascriptNodejsJavascript v8 de googleTrèsrapidev8 en moyenne 8x plus rapidequePHP(de http://shootout.alioth.debian.org/)Non bloquantSimilaireà: $(selector).click(function() {…});Mais pour tout: requête DB, routing…Pas encorecomplétement stable (0.4.6) ni “scalable”Gros buzzExpress, npm, socket.io
Clean PHPDu créateur de PHPUnitDes principes de base que les développeursonttendanceàoublierKISS – Keep it simple stupidbeware of optimizationsoptimiserseulementsinécessaire, après benchmarkDRY – don’t repeat yourselfprinciple of least astonishmentExemple: pas de getter qui change l’état!Separation of concernsSi on n’utilise pas de “ET” pour décrireuneclasse!Active record vs. Data Mapperthe boy scout ruleLaisser le code plus “propre” qu’avant de l’avoirmodifiéReviews (peer), Automated testing, refactoring, tell don’t ask…
Hidden Features of PHPSpl:SplIterator,SplQueue(RabbitMQ)StatGrab: CPU, RAM, Disk stats, …igbinary (surgithub)Plus rapide et plus efficaceque le serializeSession plus aléatoire:session.entropy_file: / dev/urandomsession.entropy_length = 32
Autres notes“Varnish in action”XHProf: de facebook (opensource)Profiler phpsur le serveur de productionNoSQLMongoDB, CouchDB, CassandraHiphop (facebook)Jenkins, xdebug (cachegrind, profiling), Alloy framework, Sinatra…
Merci!http://www.evernote.com/pub/saadtazi/confooQuestions?
retour sur confoo2011 et Symfony2

retour sur confoo2011 et Symfony2

  • 1.
  • 2.
  • 3.
    Introduction“Un autre frameworkMVC PHP (encore??)”Batiàpartir de composantsréutilisables (Yaml, Dependency Injection Container, Twig…)Full-stack framework (pas micro – voirsilex)
  • 5.
    Différence avec symfony1EntièrementréécritBeaucoup d’apprentissage avec symfony 1 => meilleurepratiquedansSymfony 2Pas de séparation entre plusieursappsSupprime les problèmes de routing entre applicationsmaisen bundle sinécessaireCaching HTTP (on va en parlerjuste après…)Utilisation des namespace php 5.3Mon “feeling”: courbed’apprentissage plus importante, moins de “magie”, beaucoup plus de Design Patterns appliqués (DIC, decoupling…)
  • 6.
    Introductionhttp://symfony.comQui a travailléavec symfony (1)? Un autre framework PHP?
  • 7.
    Une image vaut1000 mots…Structure de Symfony (code)
  • 8.
  • 9.
  • 10.
    De la requêteàla réponseUnerequêteestreçue par le front controller de SymfonyLe routing déterminequelle action estappeléeL’actionestexécutéeL’actionretourneuneréponseEn un mot, Symfonyest en charge de convertirunerequête en réponse.
  • 11.
  • 12.
    Touterequêtepasse par lefront controllerroutingUnerequêteestreçue par le front controller de SymfonyLe routing déterminequelle action estappeléeL’actionestexécutéeL’actionretourneuneréponseEn un mot, Symfonyest en charge de convertirunerequête en réponse.
  • 13.
    Routing (2)Dans app/config/routing.yml:DansDemoController.php:Routing(3)Diffrérentesapprochespossibles (combinées)YamlPhpAnnotationXmlAvantage par rapport àSymfony 1Plus flexibleInclusion de règlesexternes(Bundles… slide suivantes)
  • 14.
    BundlesUn bundle estun répertoire avec une structure prédéfinie, qui contient des classes, des controlleurs, des templates et des ressources (images, css…), des règles de routingRemplace les plugins… mais en plus génériqueConfiguration, routing par bundle possible
  • 15.
    ActionUnerequêteestreçue par lefront controller de SymfonyLe routing déterminequelle action estappeléeL’actionestexécutéeL’actionretourneuneréponseEn un mot, Symfonyest en charge de convertirunerequête en réponse.
  • 16.
    Action (2)Le Cdu MVCOu (plus “verbose”):return $this->render(’EcmaBundle:Demo:hello.twig', array('name' => $name));
  • 17.
    TwigLe V duMVCTemplate engineInspiré de Jinja, template engine PythonRapide, car compilé en PHPSupportel’héritagePas obligatoire avec Symfony 2
  • 18.
    Twig (2)(asset, blocktitle (défaut), block content, extends)
  • 19.
  • 20.
    Web Debug ToolbarSimilaireàla debug toolbar de symfony 1Activable par environnement (dev, prod…)
  • 21.
  • 22.
  • 23.
    Doctrine 2Le Mdu MVC (“enfin!”)ORM / ODM au dessus de PDOData Mapper Design Pattern au lieu de Active RecordPas nécessaireque les Classes Modèleshéritentd’uneclasse parentUneclasse qui s’occupe de faire les actions DB (Mapper - classegénéréeautomatiquement)Support de MongoDB (ODM) et CouchDB et…
  • 24.
    Doctrine 2 (2)Annotation,XML, YAML pour définir les Entités (= les classes Modèles)
  • 25.
    TestsPHPUnit +classeWebTestCase +le Crawler ComponentPermet de:simuler des requêtes HTTP, Faire des “back”, Soumettre des formulaires…http://symfony.com/doc/2.0/book/testing.html#the-test-client
  • 26.
  • 27.
    CacheGET (Etag, ...)Cacheexiste? valide?NONOUI
  • 28.
    But: ne pas“frapper” le serveur Web àchaqueappelHTTP RFC 2616 CompliantExpirationExpires=DateSurtout pour ce qui eststatique (synchronisation)Cache-control: Maxage=20, s-maxage=20 (seconds)ValidationEtag / if none matchLast-modified / if modified sinceInséré par le cache (retourne un 304 not modified)Cache (2)
  • 29.
  • 30.
    DansSymfony2La classeAppCachepeutavoir lesheaders par défautChaque action peut (re)définirles “headers de cache”On peut “wrapper” le framework par un système de cache PHP (pour tester)On peututiliser Varnish ouAkamaiou NGINX comme reverse Proxy (ou Cache Proxy) en avant du serveur WebMais comment mettre en cache le “welcome User 1” dans le header par exemple?...Cache (4)
  • 31.
    ESI: Edge SideIncludeLe reverse proxy fait un appel si nécessaireAvec Symfony2: un helper:Cache (5)
  • 32.
    Framework moderne, flexible,puissantdynamise la communauté PHPDoctine 2Symfony ComponentDependency InjectionTwigMonologSilex (à la Sinatra ou nodejs…)http://groups.google.com/group/php-standards/web/psr-0-final-proposalDocumentation: bonne, mais manque un jobeetStabilité: en pre-releasedepuis quelques temps…(j’ai omis le Formframework pour une raison…)(les dernières nouvelles…)En résumé
  • 33.
    Et le restede confoo?
  • 34.
    HTML5Trèsprésent, mêmesi onutilise HTML5 pour plus…LibrairieJavascript, SVG, …Nombreusesconférences, de Mozilla, Microsoft…Quoi faire avec les anciens browsers:Polyfillshttps://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-PolyfillsQuelséléments HTML5 sont “production ready”Video http://craftymind.com/factory/html5video/CanvasVideo.htmllocalStorageWebSocket (lien avec Nodejs plus loin ;-))File APISVG, Canvas… Pas prêtEmbedDBDrag & Drop…
  • 35.
    Server-Side JavascriptNodejsJavascript v8de googleTrèsrapidev8 en moyenne 8x plus rapidequePHP(de http://shootout.alioth.debian.org/)Non bloquantSimilaireà: $(selector).click(function() {…});Mais pour tout: requête DB, routing…Pas encorecomplétement stable (0.4.6) ni “scalable”Gros buzzExpress, npm, socket.io
  • 36.
    Clean PHPDu créateurde PHPUnitDes principes de base que les développeursonttendanceàoublierKISS – Keep it simple stupidbeware of optimizationsoptimiserseulementsinécessaire, après benchmarkDRY – don’t repeat yourselfprinciple of least astonishmentExemple: pas de getter qui change l’état!Separation of concernsSi on n’utilise pas de “ET” pour décrireuneclasse!Active record vs. Data Mapperthe boy scout ruleLaisser le code plus “propre” qu’avant de l’avoirmodifiéReviews (peer), Automated testing, refactoring, tell don’t ask…
  • 37.
    Hidden Features ofPHPSpl:SplIterator,SplQueue(RabbitMQ)StatGrab: CPU, RAM, Disk stats, …igbinary (surgithub)Plus rapide et plus efficaceque le serializeSession plus aléatoire:session.entropy_file: / dev/urandomsession.entropy_length = 32
  • 38.
    Autres notes“Varnish inaction”XHProf: de facebook (opensource)Profiler phpsur le serveur de productionNoSQLMongoDB, CouchDB, CassandraHiphop (facebook)Jenkins, xdebug (cachegrind, profiling), Alloy framework, Sinatra…
  • 39.

Notes de l'éditeur

  • #5 Pareilousimilaire: routing (plus flexible)Cascade des configuration
  • #17 Pareilousimilaire: routing (plus flexible)Cascade des configuration
  • #32 Avantage du helper: si le reverse proxy nesignale pas qu’ilsupporte les ESI, alors pas de tag ESI
  • #33 Avantage du helper: si le reverse proxy nesignale pas qu’ilsupporte les ESI, alors pas de tag ESI
  • #34 Avantage du helper: si le reverse proxy nesignale pas qu’ilsupporte les ESI, alors pas de tag ESI