Architecture PHP 3 tier avec Zend en backend de Drupal
1. Architecture PHP 3 tier
avec Zend en backend de Drupal
PHPTOUR
29 novembre 2012
Thomas DELERM – tdelerm@sigma.fr
2. 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
3. Conférencier et Résumé
- 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ées
A 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.
3
4. Du choix du bon outil
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.
4
6. Les faiblesses de Drupal à combler
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
7. 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
9. Architecture d’un Drupal seul
Branchement de
test unitaires
Front office
Front office
Drupal 77Cœur
Drupal Cœur
Back office
Back office
Frontend
Frontend
Drupal 77
Drupal
Modules
Modules
Communs
Communs
Drupal 77
Drupal
Modules
Modules
Spécifiques
Spécifiques
Base Drupal
Base Drupal
MySQL
MySQL
Base Métier
Base Métier
Module Services ::REST client et serveur
Module Services REST client et serveur
Implémentation
Implémentation
Implémentation
Implémentation
des Web Services
de l’intégration
des Web Services
de l’intégration
Site mobile
Site mobile
ou client externe
ou client externe
Drupal 77
Drupal
Spécifique projet
Spécifique projet
Drupal 77
Drupal
Serveur REST
Serveur REST
pour mobiles
pour mobiles
FTP ––Fichiers clients
FTP Fichiers clients
Serveur REST
Serveur REST
9
10. 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
11. Testabilité
Drupal pur
Drupal + Zend
function 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);
}
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
11
12. 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
14. Faire cohabiter Zend et Drupal
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
14
15. Faire cohabiter Zend et Drupal
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 !
15
16. Faire cohabiter Zend et Drupal
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.
16
17. Solution : architecture technique
Branchement de
tests unitaires
Drupal + Zend
Front office
Front office
Drupal 77Cœur
Drupal Cœur
Back office
Back office
Frontend
Frontend
Drupal 77
Drupal 77
Drupal
Drupal
Modules
Modules
Modules
Modules
Communs Spécifiques
Communs Spécifiques
Base Drupal
Base Drupal
MySQL
MySQL
API REST
Site mobile
Site mobile
ou client externe
ou client externe
Web Services spécifiques
Web Services spécifiques
Zend_Rest serveur
Zend_Rest serveur
Implémentation
Implémentation
Des Web Services
Des Web Services
Implémentation
Implémentation
de l’intégration
de l’intégration
Drupal 77
Drupal
Zend Framework
Zend Framework
Zend_Db
Zend_Db
Queues
Queues
Intégration
Intégration
Crons
Crons
Client REST
Client REST
Les deux bases
peuvent être sur le
même serveur
Base Métier
Base Métier
PostgreSQL
PostgreSQL
Spécifique projet
Spécifique projet
Zend
Zend
FTP ––Fichiers clients
FTP Fichiers clients
Serveur REST
Serveur REST
17
20. 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
21. 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
22. Mix des solutions 3 et 4
Schéma d’utilisation
Appel HTTP
Appel HTTP
Solution 4 : include
Drupal 77
Drupal
Classe d’appel Zend
Classe d’appel Zend
Drupal 77
Drupal
Zend
Zend
Configuration
Configuration
Solution 3 : REST
Drupal 77
Drupal
Client Web Service
Client Web Service
Web Service
Web Service
Zend
Zend
Drupal 77
Drupal
Spécifique projet
Spécifique projet
Zend
Zend
22
23. 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
24. 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
25. Impact : application mobile / TV
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, luimême appelle API Zend si besoin
– Pas optimisé
25
26. 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
27. 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
28. Impact : Formulaires / Synchronisation
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
29. 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
30. 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
31. 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
32. 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