Drupal comme vous ne l’avez jamais vu

Drupal comme vous ne l’avez jamais vu

Drupal et de manière générale PHP sont souvent utilisés dans un écosystème limité. Nous proposons de défricher avec vous de multiples modèles d’intégration permettant d’accélérer les développements tout en améliorant les performances et l'industrialisation, ainsi que d’apporter de nouveaux usages (moteurs à facettes, temps réel, graphiques, stockage documentaire).

Du prototype fonctionnel jusqu’à son industrialisation, l’intégration judicieuse avec des briques externes peut résoudre simplement des tâches complexes. Cette présentation montrera comment, par des actes concrets, on peut tirer partie de briques techniques tierces depuis PHP. La session s'appuiera sur des retours d'expérience et des exemples de cas réels.

539b55c76d7cf05657cb8b4e9a87d079?s=128

Simon Perdrisat

June 06, 2012
Tweet

Transcript

  1. Drupal comme vous ne l’avez jamais vu

  2. Bastien Jaillot (bastnic) – JoliCode Simon Perdrisat (gagarine) - cloud33

  3. Évolution des usages

  4. None
  5. ...rendre les projets Drupal plus excitant

  6. ...rendre les projets Drupal plus excitant PHP

  7. ...rendre les projets web plus excitant

  8. Libre Hautement configurable (multiples variantes) Multilingue Multi-sites Hautement intégrable Projet

    pilote – Open Gouvernement dans la francophonie
  9. http://www.le-couteau-suisse.com/exclusivites-wenger/wenger-giant-knife-p-352.html

  10. Quel outils choisir ??!

  11. None
  12. PHP !!! Fiable, répandu, mature* Connu au seins des administrations

    * En version 8.2 le choix Drupal
  13. — There is a module for that —

  14. Une API complète pour des modules basé sur PHP/MySQL. Écrire

    son module
  15. ... il faut coder puis maintenir http://www.jedessine.com/c_6565/coloriage/coloriage- fetes/coloriage-halloween/coloriage-momie- halloween/coloriage-d-une-momie

  16. ?

  17. A nice duct tape fix Making a square fit into

    a round hole. Credit: NASA
  18. Ne pas utiliser (que) Drupal

  19. Améliorer le développement de thème Chapitre 1/6

  20. Rendu d'un champs (field)* * nous vous épargnons le rendu

    de la page complète.
  21. None
  22. m t h e r s h i p –

    séparation couche drupal
  23. m t h e r s h i p –

    Sémantique (HTML5) VS
  24. m t h e r s h i p –

    Sémantique (HTML5) VS
  25. m o t h e r s h i p

    – Sémantique (HTML5) VS Indigestion de class Éléments HTML5
  26. None
  27. m o t h e r s h i p

    Libère votre thème de l'HTML/CSS spécifique à Drupal pour une normalisation du code.
  28. Utiliser des composants standards

  29. None
  30. Notre design !

  31. Hum...

  32. twitter.github.com

  33. None
  34. Less.css – The One dynamic stylesheet language

  35. réglages de bootstr Désactiver les composants non utilisé mixins import

    composant
  36. m o t h e r s h i p

    + bootstrap + less --- love ---
  37. Utiliser des composants PHP externes PSR-0 FTW Chapitre 2/6

  38. Ryan Weaver, dec. 2011 « Lack of sharing means duplicated

    efforts » http://www.slideshare.net/weaverryan/a-php-christmas-miracle-3-frameworks-1-app
  39. PSR – PHP Standard Reference PSR-0 : accord sur une

    “norme” d'autoloading Symfony2, Zend Framework 2, Lithium, PEAR, Drupal, eZ, CakePHP, Doctrine, Propel, Composer, Agavi, Joomla, phpBB, … like this.
  40. PSR-0 : deux possibilités namespaces class : Symfony\Component\HttpFoundation\Request path :

    vendor/src/Symfony/Component/HttpFoundation/Request. php underscores class : Twig_Extension_Core path : vendor/twig/lib/Twig/Extension/Core.php
  41. None
  42. Composants PHP standalones Serializer – Guzzle – autoloader – twig

    – Imagine – Gaufrette – Exporter – Buzz – PHPParser – Symfony2 Components – Zend Framework 2 components - Lythium components – Mink – Behat – Goutte …
  43. Drupal 8 – PSR-0 ready Empruntés à Symfony2 HttpKernel, HttpFoundation

    (Request et Response objects), EventDispatcher (remplace avangeteusement les hook), ClassLoader, Yaml, DependencyInjection Et bientôt : Routing, Session,… http://www.garfieldtech.com/blog/wscci-kernel-merge
  44. module Drupal – Composants externes $ cat README.txt INSTALLATION ============

    1) Install behat on your machine following these instructions: http://docs.behat.org/quick_intro.html#installation 2) Copy file "behat.yml" and directory "features" to site root directory. 3) Customize the path to "behat/bootstrap" in behat.yml if the behat module isn't located at "sites/all/modules/behat" 4) Set $base_url in settings.php if your site is not accessible at http://localhost/ (otherwise drupalPost() won't work)
  45. autoloading ??! dépendance ? version ?? mise à jour ?

  46. Installation (comme un pro) PEAR – PHP Extension and Application

    Repository ?
  47. So 2005! w.st-guilhem-le-desert.fr/legendes_diable_pauvre_paysan-p129.htm

  48. Git Submodule ? Phar ?

  49. So 2011!

  50. Composer ! Gestionnaire de dépendance Installeur / autoloader http://getcomposer.org http://packagist.org

  51. Composer.json { "require": { "php": ">=5.3.0", "behat/mink": "1.4.0", "behat/mink-goutte-driver": "dev-master"

    } } So easy!
  52. $ curl http://getcomposer.org/installer | php $ php composer.phar install Installing

    dependencies - Installing symfony/event-dispatcher (dev-master) Cloning d9ef2afd0218415a8c04ea48a2c83bb5b8f0f51c - Installing behat/mink-goutte-driver(dev-master) Cloning a9dbd268659d19eabcc8285ca4622b232f55aa91 […] symfony/http-kernel suggests installing symfony/event-dispatcher (dev- master) symfony/http-kernel suggests installing behat/mink-goutte-driver(dev-master) […] Writing lock file Generating autoload files
  53. Bam!

  54. Be lazy $ drush dl composer # once $ drush

    composer install https://drupal.org/project/composer
  55. $ cat minktest.module /** * Implements hook_init() */ function minktest_init()

    { // the autoloader file is generated by composer require(__DIR__ . '/vendor/autoload.php'); } /** * Non useful function */ function minktest_toto() { $mink = new Behat\Mink\Mink(); $driver = new \Behat\Mink\Driver\GoutteDriver(); // […] }
  56. Dénormalisation de données Chapitre 3/6

  57. Les “fields” dans Drupal - gestion de révisions - multilangue

    - cardinalité - valeurs par défaut - validation - … … Mais la lecture en masse est coûteuse
  58. Stocker vos calculs Stocker des données pré-calculées Gain de performance

    ! Portabilité des données Utilisable directement sans repasser par Drupal
  59. Alternatives de stockage NoSQL Cassandra CouchDB MongoDB Indexation des données

    solr elasticsearch xapian sphynx Cache : redis, memcache
  60. None
  61. // Connect $mongo = new Mongo(); // Créer / Sélectionner

    la DB $db = $mongo->testDB; // Créer / Sélectionner la collection (=table) $collection = $db->nodes; // Charger un node $node = (array)node_load($nid); // Stocker dans MongoDB $collection->save($node); PHP Insertion
  62. // Connection $mongo = new Mongo(); // Filtre sur le

    nid $filter = array( 'nid' => 3, ); // Run! mongo->DB->collection-> $res = $mongo->testDB>nodes->find($filter); // Print print $res[0]['title']; PHP Requête
  63. Shell mongoDB > use testDB; > db.nodes.find( {nid: 3} ,

    {title: true}); { "_id" : ObjectId("5430304500"), "title" : "Mon titre" }
  64. Intégration – Drupal drupal.org/project/mongodb

  65. Search API

  66. Entity Metadata Search API Solr MongoDB bdd, sphynx, elasticsearch xapian,

    ... Views Node Utilisateur Fields Fichier Données indexers Drupal + Search API
  67. Entity Metadata Search API Solr MongoDB bdd, sphynx, elasticsearch xapian,

    ... Views Node Utilisateur Fields Fichier Données indexers Node.js Python
  68. Search API c'est encore ! Multiples indexes Altération des données

    Jointures à la création Interface graphique Extensible
  69. Temps réel Chapitre 4/6

  70. Requête HTTP timeout(500) Drupal (Full bootstrap) Client Server Réponse HTTP

  71. Requête HTTP timeout(500ms) node.js + mongo Client Server Réponse HTTP

  72. HTTP c'est lent

  73. socket.io

  74. http://www.websocket.org/quantum.html

  75. http://www.websocket.org/quantum.html WooT!

  76. // Client (index.html) <script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost');

    socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script> // Server (app.js) io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); });
  77. Requête HTTP client1 Drupal Client Server Réponse HTTP node.js client2

    client2 ... Socket! Broadcast
  78. Drupal – intégration node.js

  79. Tests Chapitre 5/6

  80. n'évoluera plus lenteur Test fonctionnel utilise un client HTTP "propriétaire"

    (open source mais utilisé nul part ailleurs) Drupal utilise SimpleTest (patché)
  81. SimpleTest est uniquement maintenu PHPUnit Atoum

  82. Briques supérieures - Mink : navigateur sous forme de driver

    selenium, sahi, goutte - Behat : BDD (Behavior driven development) - Atoum
  83. None
  84. Monitoring applicatif / statistiques Chapitre 6/100* * courage, plus que

    94 chapitres
  85. Collecte de données / graphes Le module statistics est une

    catastrophe Alternatives : - graphite / statsd (by Etsy/Flickr) - new relic (SaaS) - cacti
  86. Métriques ? - état serveur (mémoire, cpu, etc.) - nombre

    d'utilisateurs (connectés / déconnectés) - temps de génération de page - nombre de requêtes sql - ratio page en cache / page non en cache - nombre de scripts css / js généré Il devient très facile d'en ajouter, donc on se retrouve à en avoir beaucoup et c'est BIEN.
  87. Code PHP applicatif Serveur StatsD agrège et envoi Graphite stocke

    Graphite visualise les métriques UDP
  88. function etsy_statsd_shutdown_real() { // time page $time = timer_read('page'); StatsD::timing("drupal.page.totaltime.ogos",

    $time); // query count $queries = Database::getLog('etsy_statsd', 'default'); StatsD::updateStats("drupal.mysql.querycount. ogos", count($queries)); }
  89. None
  90. Crédits : 20minutes.fr

  91. Miam !!

  92. À vous de jouer !

  93. Gestionnaire de queue : zeromq, rabbitmq Outil de mailing :

    intégration avec un mailer (mailchimp) Interface offline : Services + backbone.js ... Pistes à explorer
  94. Cas concret – projet Drupal qa.drupal.org travisci drush composant sf2

    Console drush make composer stack git github registry PSR-0 Concentrer les efforts sur la valeur ajoutée du projet construire le meilleur CMS au monde
  95. Drupal 8 est prêt dans 2 ans (on est pessimiste

    réaliste) Pourquoi attendre ?
  96. Réutiliser le travail des autres, contribuer, partager – travailler moins

    mieux
  97. https://joind.in/talk/view/6455 Questions ?

  98. • Ryan Weaver (KNP Labs USA) “A PHP Christmas Miracle

    - 3 Frameworks, 1 app” http://www.slideshare.net/weaverryan/a-php-christmas- miracle-3-frameworks-1-app • Matthieu Guillermin et Nicolas Chambrier “Mettez du temps réel dans votre Drupal avec NodeJS” http://lyon2012.drupalcamp.fr/fr/mettez-du-temps-r-el- dans-votre-drupal-avec-node-js • Larry Garfield – “The Kernel has landed” http://www.garfieldtech.com/blog/wscci-kernel-merge Sources
  99. Sources / Pour aller plus loin • Kenny Dits –

    “Performances php chez M6Web” http://www.slideshare.net/kennydee/performances-php- chez-m6web • Morten dk “HTML 4S – while we are waiting for the revolution” https://dl.dropbox.com/u/51287/2012-drupalcon-denver- html4s.pdf • Timothée Peignier – “Un site web mobile en Django” https://speakerdeck.com/u/tim/p/un-site-web-mobile-en- django
  100. Sources / Pour aller plus loin • Shashikant Jagtap –

    « ATDD with Behat and Selenium » http://www.slideshare.net/Shashikant86/atdd-with-behat- and-selenium-ldnse6 • Jean-Marc Fontaine « La gestion des dépendances dans un projet PHP » http://www.slideshare.net/JMF/gestion-des-dpendances- dans-un-projet-php-forum-php-2012