34
Architecture PHP 3 tier avec Zend en backend de Drupal PHPTOUR 29 novembre 2012 Thomas DELERM – [email protected]

Architecture PHP 3 tier avec Zend en backend de Drupal

Embed Size (px)

DESCRIPTION

Comment allier les fonctionnalités de Drupal et la robustesse de Zend

Citation preview

Page 1: Architecture PHP 3 tier avec Zend en backend de Drupal

Architecture PHP 3 tier avec Zend en backend de Drupal

PHPTOUR29 novembre 2012

Thomas DELERM – [email protected]

Page 2: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 3: Architecture PHP 3 tier avec Zend en backend de Drupal

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.

Page 4: Architecture PHP 3 tier avec Zend en backend de Drupal

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.

Page 5: Architecture PHP 3 tier avec Zend en backend de Drupal

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 = +

Page 6: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 7: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 8: Architecture PHP 3 tier avec Zend en backend de Drupal

Mariage ?

+ =?8

Crédit www.guillaumebaret.fr

Page 9: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 10: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 11: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 12: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 13: Architecture PHP 3 tier avec Zend en backend de Drupal

Comment ?

13

Page 14: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 15: Architecture PHP 3 tier avec Zend en backend de Drupal

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 !

Page 16: Architecture PHP 3 tier avec Zend en backend de Drupal

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.

Page 17: Architecture PHP 3 tier avec Zend en backend de 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

Page 18: Architecture PHP 3 tier avec Zend en backend de Drupal

Code : client Drupal

18

Page 19: Architecture PHP 3 tier avec Zend en backend de Drupal

Code : serveur Zend

19

Page 20: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 21: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 22: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 23: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 24: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 25: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 26: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 27: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 28: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 29: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 30: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 31: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 32: Architecture PHP 3 tier avec Zend en backend de Drupal

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

Page 33: Architecture PHP 3 tier avec Zend en backend de Drupal

Tour de table - Questions

33

Page 34: Architecture PHP 3 tier avec Zend en backend de Drupal

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