Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Simon Perdrisat

June 06, 2012
Tweet

More Decks by Simon Perdrisat

Other Decks in Programming

Transcript

  1. ?

  2. m t h e r s h i p –

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

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

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

    – Sémantique (HTML5) VS Indigestion de class Éléments HTML5
  6. 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.
  7. m o t h e r s h i p

    + bootstrap + less --- love ---
  8. Ryan Weaver, dec. 2011 « Lack of sharing means duplicated

    efforts » http://www.slideshare.net/weaverryan/a-php-christmas-miracle-3-frameworks-1-app
  9. 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.
  10. 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
  11. Composants PHP standalones Serializer – Guzzle – autoloader – twig

    – Imagine – Gaufrette – Exporter – Buzz – PHPParser – Symfony2 Components – Zend Framework 2 components - Lythium components – Mink – Behat – Goutte …
  12. 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
  13. 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)
  14. $ 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
  15. Be lazy $ drush dl composer # once $ drush

    composer install https://drupal.org/project/composer
  16. $ 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(); // […] }
  17. Les “fields” dans Drupal - gestion de révisions - multilangue

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

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

    solr elasticsearch xapian sphynx Cache : redis, memcache
  20. // 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
  21. // 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
  22. Shell mongoDB > use testDB; > db.nodes.find( {nid: 3} ,

    {title: true}); { "_id" : ObjectId("5430304500"), "title" : "Mon titre" }
  23. Entity Metadata Search API Solr MongoDB bdd, sphynx, elasticsearch xapian,

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

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

    Jointures à la création Interface graphique Extensible
  26. // 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); }); });
  27. n'évoluera plus lenteur Test fonctionnel utilise un client HTTP "propriétaire"

    (open source mais utilisé nul part ailleurs) Drupal utilise SimpleTest (patché)
  28. Briques supérieures - Mink : navigateur sous forme de driver

    selenium, sahi, goutte - Behat : BDD (Behavior driven development) - Atoum
  29. Collecte de données / graphes Le module statistics est une

    catastrophe Alternatives : - graphite / statsd (by Etsy/Flickr) - new relic (SaaS) - cacti
  30. 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.
  31. 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)); }
  32. Gestionnaire de queue : zeromq, rabbitmq Outil de mailing :

    intégration avec un mailer (mailchimp) Interface offline : Services + backbone.js ... Pistes à explorer
  33. 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
  34. Drupal 8 est prêt dans 2 ans (on est pessimiste

    réaliste) Pourquoi attendre ?
  35. • 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
  36. 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
  37. 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