Post on 22-Jun-2015
description
transcript
Architecture PHP 3 tier avec Zend en backend de Drupal
PHPTOUR29 novembre 2012
Thomas DELERM – tdelerm@sigma.fr
Sommaire
Quel outil pour quel projet ? Un mariage Zend et Drupal ? Les solutions Impact : REST Impact : Mobile / TV Impact : socle, cache et
transactions Discussion
2
Conférencier et Résumé
3
- Diplômé des Mines de Douai en 2002, expert en m-commerce- Mise en place d’une plateforme de téléchargement de contenus (groupe Lagardère)- Réalisation de la 1e brique en Europe de t-commerce (paiement pour les sites TV) en 2010-2011- Référent technique PHP au sein de Sigma Web Solutions.
RésuméDans le monde PHP, les différents frameworks et CMS coexistent sans trop s’interfacer. Pourtant, tirer parti des points forts de chacun permet de travailler plus efficacement. En partant des forces de Zend et de Drupal, cette présentation explique plusieurs façons de brancher les deux outils (notamment via REST), et analyse les mondes ouverts par ce duo : - La création d’applications (mobile ou TV) branchées sur le duo Zend/Drupal - La ré utilisation du code Zend comme un socle de backend projets- La synchronisation des caches Zend et Drupal- Le problème causé par les transactions distribuéesA l’aide de courts extraits de code et de schémas, cette présentation donne les bases d’une architecture 3 tier plus proche de ce qui existe en Java.
Du choix du bon outil
4
Il y a énormément d’outils pour construire un site professionnel
- Un framework ? Zend, Symfony, CakePHP, Yii, ..
-Un CMS ? Drupal, Joomla, Wordpress, Typo3, Concrete5 ..
- Un CMS basé sur un Framework ? Centurion, Sympal ..
- Un outil propriétaire ? Medialibs, ASPresso ..
Choisir l’un d’eux est comme un mariage.
Des points forts différents
5
Thème CMS (Drupal) Framework (Zend)
Contenus + -
Sécurité + +
Droits + =
Workflow + -
Formulaires - =
Ergonomie = +
Métier - +
Mobilité + =
Règles de gestion - +
Maintenance = +
Sa philosophie– Pas d’objets– Corrélativement, pas/peu de tests unitaires– Pas de classes pour gérer le métier – pas de
modèles– Mélange des données et des paramètres dans la
même DB
Des fonctionnalités pro manquantes– Intégration de données externes : fichiers FTP,
email– Sauvegarde des données vers une base métier– Importer des données depuis un web service, puis
les utiliser ou les exposer– Reprise sur incident et gestion de queues
6
Les faiblesses de Drupal à combler
Pourquoi choisir ? Ce sont des outils pour des sites différents
– Drupal est magique pour un site institutionnel, un office de tourisme, un acteur public
– Zend excelle avec une forte partie métier, scalabilité avec Zend Server, connexion à du Java..
Pourquoi prendre CMS OU Framework quand on peut avoir les deux ?– Drupal 7– Zend Framework 1.11
7
Mariage ?
+ =?8
Crédit www.guillaumebaret.fr
Architecture d’un Drupal seul
9
Base MétierBase Métier
Drupal 7Drupal 7
Front officeFront office
Spécifique projetSpécifique projet
Back officeBack office
Base DrupalMySQL
Base DrupalMySQL
Drupal 7 Cœur
Frontend
Drupal 7 Cœur
Frontend
Drupal 7Modules
Communs
Drupal 7Modules
Communs
Drupal 7Modules
Spécifiques
Drupal 7Modules
Spécifiques
FTP – Fichiers clientsServeur REST
FTP – Fichiers clientsServeur REST
Site mobileou client externe
Site mobileou client externe
Branchement de test unitaires
Drupal 7Serveur REST pour mobiles
Drupal 7Serveur REST pour mobiles
Module Services : REST client et serveurModule Services : REST client et serveur
Implémentationdes Web Services Implémentation
des Web Services Implémentationde l’intégration Implémentationde l’intégration
Mariage ? Est-ce nécessaire ?
Drupal PEUT gérer du client serveur– Modules additionnels pour cela– Le côté serveur pourrait attaquer la base car le
cœur Drupal sait le faire : DAL + Schema API Drupal PEUT avoir des tests unitaires
MAIS Problème 1 : ré utilisabilité du code
– Serveur REST sous Zend = facilement intégrable à côté d’un Drupal.
– Réciproque fausse : installer un Drupal entier pour donner une couche serveur REST à du Zend ou à un autre CMS serait complexe.
Problème 2 : scalabilité Problème 3 : testabilité 10
Testabilité
Drupal pur Drupal + Zendfunction displayAllDepots(){
$param1 = $this->getPost(‘param1’);
$db = new DbConnection();
$results = $db->query(MyRequests::get(‘getAllDepots’, $param1);
$maVue->set(‘depots’,$results);
}
function displayAllDepots(){
$param1 = $this->getPost(‘param1’);
$rc = new RestConnection();
$results = $rc->call(‘getAllDepots’,$param1);
$maVue->set(‘depots’,$results);
}
11
Le pseudo code écrit est très similaire mais– Test unitaire facile à faire avec un client REST: on sait tout de suite si le
problème vient du front ou du back
– Définition claire des signatures de méthodes REST et de la liste de paramètres: cela oblige à réfléchir aux besoins de lecture et écriture sur la base, et à écrire des méthodes génériques
• Exemple : au lieu de méthodes getAllDepotsByName et getAllDepotById• Ecriture d’une méthode REST unique getAllDepots(paramètre: valeur dans {id,
name})
– Traitement des erreurs centralisé et commun pour toutes les requêtes : nul, vide, requête incorrecte, paramètre manquant.. La brique de requête basée sur Zend_Db est blindée et commune à tous les projets Drupal ou Zend
Mariage ? Pourquoi Zend Zend et Drupal sont complémentaires
MVC est adapté pour servir des URLs web service Pas de base de données « interne » car config dans
application.ini Orienté objet Zend_Db est associé à un générateur de
modèle. Intégration des vues Twig Profiter de toute la bibliothèque Zend : Zend_Queue,
Zend_Paginator, Zend_Log, Zend_Test_PHPUnit , Zend_Json, appels asynchrones …
12
Comment ?
13
Faire cohabiter Zend et Drupal
14
1 Inclure Zend dans Drupal ?– http://drupal.org/project/zend– Réduit Zend à une librairie– MVC de Zend pas utilisé => pas possible d’avoir
des APIs routées vers Zend– Possibilité : faire des « redirections » via des
hooks mais cela oblige à recoder tout le « routage » de Zend [1]
– Pas scalable NON
Faire cohabiter Zend et Drupal
15
2 Zend en maitre Zend récupère le routage HTTP Comment « exécuter » Drupal ? Pas pertinent car Drupal offre une bonne
interface backoffice que Zend n’a pas Comment respecter les hooks Drupal ?
NON !
Faire cohabiter Zend et Drupal
16
3 Zend en tant que Web service– Zend sur le port 8001– Appel REST (depuis Drupal ou en AJAX
directement depuis le client)
4 Appel à Zend depuis Drupal– Les classes Zend sont « includées » et
l’application Zend lancée par Drupal– Evite la latence HTTP– Utilise un Zend_Controller_Router custom pour
simuler une requête HTTP lors d’un appel par Drupal.
Solution : architecture technique
17
Drupal + Zend
Les deux bases peuvent être sur le même serveur
Base MétierPostgreSQLBase MétierPostgreSQL
Drupal 7Drupal 7
Front officeFront office
Spécifique projetSpécifique projet
Back officeBack officeBase Drupal
MySQLBase Drupal
MySQL
Drupal 7 Cœur
Frontend
Drupal 7 Cœur
Frontend
Drupal 7Modules
Communs
Drupal 7Modules
Communs
Drupal 7Modules
Spécifiques
Drupal 7Modules
Spécifiques
Zend Framework Zend Framework
ImplémentationDes Web Services Implémentation
Des Web Services
Web Services spécifiquesWeb Services spécifiques
ZendZend
API REST
Zend_DbZend_Db
QueuesIntégration
CronsClient REST
QueuesIntégration
CronsClient REST
Zend_Rest serveurZend_Rest serveur
Implémentationde l’intégration Implémentationde l’intégration
FTP – Fichiers clientsServeur REST
FTP – Fichiers clientsServeur REST
Site mobileou client externe
Site mobileou client externe
Branchement de tests unitaires
Code : client Drupal
18
Code : serveur Zend
19
Solution 4 : include de Zend Côté Drupal
Côté Zend– Une classe routeur qui ne fait rien
– Un connecteur avec un Zend_Controller_Front
20
Solution 4 : include de Zend Un callURL pour lancer l’application
Schéma d’utilisation concomitante du REST + include grâce à la surcouche de choix côté Drupal
21
Mix des solutions 3 et 4 Schéma d’utilisation
2222
Drupal 7Drupal 7
Spécifique projetSpécifique projet
Drupal 7
Configuration
Drupal 7
Configuration
Drupal 7Classe d’appel Zend
Drupal 7Classe d’appel Zend
Drupal 7Client Web Service
Drupal 7Client Web Service
ZendZend
ZendZend
Web Service Zend
Web Service Zend
Appel HTTPAppel HTTP
Solution 4 : include
Solution 3 : REST
Solution : découpage Drupal 7 gère
– Toutes les fonctionnalités front : maps, jQuery, graphiques, drag’n’drop, HTML5
– Tous les appels HTTP à des pages Zend Framework
– Tous les appels HTTP pour des données– Base de données métier– Serveur REST interne + client REST vers les
ressources externes– API métier Mobile– Tests unitaires
23
Impact: REST en PHP API en REST+JSON
– Soap surtout utile avec des langages typés pas en PHP
– REST+JSON plus rapide pour la dé sérialisation
– Mise en cache du résultat côté Drupal (cf. plus loin)
– Souci réglé : contenu exact du message car Zend attendait un json=
24
Site par utilisation de templates– Echange de JSON sur navigateur
HTML5– Version mobile Drupal (template)
[4]– Récupération des données de
formulaire/frontend par Drupal, lui-même appelle API Zend si besoin
– Pas optimisé
25
Impact : application mobile / TV
Application mobile « standard » :– Développement natif (Android, Iphone, …)– Appels aux API Drupal (module Services)– Quid des données Zend ?
Application TV spécifique :– Seulement si pas de support HTML5– Application spécifique au STB/firmware avec parsing
JSON
26
Impact : application mobile / TV
Application mobile / TV « maligne »– Développement Full JS/HTML5 Sencha– Connecter Sencha + Phonegap Zend– Drupal Services comme fournisseur de données– Réutilisation du même code JS/HTML pour les apps
mobile et TV– Ce même code peut-être publié comme site HTML5– ! CSS et sécurité
Convergence vers une application unique
Web / Mobile / Tablette / TV
27
Impact : application mobile / TV
Formulaire Drupal– Récupération des valeurs (combos, ..) en cache
Drupal– Saisie utilisateur– Appel API écriture Zend– Synchronisation des deux caches
Attention ! Il faut transformer les id et node pour s’y retrouver : garder trace de l’id Zend côté Drupal
28
Impact : Formulaires / Synchronisation
Impact : les niveaux de cache Beaucoup de niveaux utilisables
– Cache MySQL– Zend_Cache– Cache Drupal
– Cache serveur (Apache)– Load balancer, CDN ou équipement réseau.
Conseils– Synchroniser les caches Zend et Drupal– Temps de rétention croissants et configurables
29
Impact : ré utilisation Partie Zend : zones spécifiques en rouge
En jaune, du code
réutilisable, par exemple- Gestion d’erreur- Générateur de modèles et objets JSON/XML- Décodage des messages
30
Impact : transactions distribuées PHP ne sait pas gérer les transactions
distribuées !– Pas prévu sous PDO : le 2PC (two phase commit) est
non supporté– Empêche le rollback correct de ce type de code
31
Impact : transactions distribuées
Solutions ? Aucune satisfaisante pour le moment
– Rollback manuel de chaque API en compensation de transaction [2]
– LIXA [3]– Schéma de données avec des champs « actif » 0/1
32
Tour de table - Questions
33
Liens [1]
http://www.cestfait.ch/content/drupal-bridge-zend-yeah
[2]http://en.wikipedia.org/wiki/Compensating_transaction
[3]http://sourceforge.net/apps/mediawiki/lixa/index.php?title=FAQ:_Frequently_Asked_Questions
[4] http://www.bluedrop.fr/ressources-drupal-et-les-sites-version-mobile
34