Architecture PHP 3 tier avec Zend en backend de Drupal

Post on 22-Jun-2015

605 views 0 download

Tags:

description

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

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