Ouvrir le fichier PDF - Jean

Transcription

Ouvrir le fichier PDF - Jean
Extension ZIP pour PHP
2
9/2010
Extension ZIP pour PHP
web 2.0
Ajax
SGBD
oracle
mysql
mssql
windows
linux
Cloud
HTML
CSS
PHP
XML
Apache
IIS
REST *
Web
SSO
(*) SOA, Interfaces, webservices, SOAP
b-pack développe les applications des grandes entreprises du
secteur privé et public pour la gestion des processus
stratégiques finances et achats.
Vous êtes passionné par les nouvelles technologies ?
Rejoignez-nous, et participez à la création de la nouvelle
génération de logiciels d’entreprises.
Retrouvez la liste des postes ouverts sur:
http://www.b-pack.fr/societe/carriere
Paris
Aix-en-provence
Atlanta
Immeuble Technologies
84-88 bd de la M° Marchand
92400 Courbevoie
220 Rue Denis Papin
Héliosis Batiment A
13857 Aix-en-Provence
303 Perimeter Center North
Suite 300
Atlanta, GA 30346
3
DPOUBDUFN!JMKPC!CQBDLDPN
9/2010
5/2011
Le périodique phpsolutions est publié par
Software Press Sp. z o.o. SK
Bokserska 1, 02-682 Varsovie, Pologne
Tél. 0975180358, Fax. +48 22 244 24 59
www.phpsolmag.org
TABLE DES MATIÈRES
Président de Software Press Sp. z o.o. SK :
Paweł Marciniak
Directrice de la publication :
Justyna Książek
Dépôt légal :
à parution
ISSN : 1731-4593
Rédacteur en chef :
Łukasz Bartoszewicz
Couverture :
Przemysław Banasiewicz
DTP :
Przemysław Banasiewicz
[email protected]
Composition :
Przemysław Banasiewicz
Correction :
Valérie Viel, Thierry Borel, Barbara Bourdelles
Bêta-testeurs :
Brice Favre, Valérie Viel, Cyril David,
Christophe Milhau, Alain Ribault, Stéphane Guedon,
Eric Boulet, Mickael Puyfages, Christian Hernoux,
Isabelle Lupi, Antoine Beluze, Timotée Neullas,
Yann Faure, Adrien Mogenet, Jean-François Montgaillard,
Turmeau Nicolas, Jonathan Marois, Wilfried Ceron,
Wajih Letaief, François Van de Weerdt, Eric Vincent,
Franck Michaël Assi, Francis Hulin-Hubard,
Nicolas Dumas, David Michaud.
Les personnes intéressées par la coopération
sont priées de nous contacter :
[email protected]
Publicité :
[email protected]
Pour créer les diagrammes on a utilisé le programme
AVERTISSEMENT
Les techniques présentées dans les articles
ne peuvent être utilisées qu’au sein des réseaux
internes. La rédaction du magazine n’est pas
responsable de l’utilisation incorrecte des techniques
présentées. L’utilisation des techniques présentées peut
2
VARIA
6 Actualités
Actualités du monde du développement.
Christophe Villeneuve
8 Interview de François-Xavier Bois
François-Xavier Bois, Directeur associé de Kernix Software
10 Interview de Florent Sabourin
Florent Sabourin, Responsable de l’offre e-commerce
chez Smile
OUTILS
12 Les solutions Cloud à l’usage d’Ikoula
Jules-Henri Gavetti
Ikoula, hébergeur informatique depuis 1998, est le leader du Cloud Computing en France. Avec plus de 8
000 machines virtuelles en production et plusieurs années d’expérience dans la virtualisation, Ikoula développe des solutions de Public et de Private Cloud,
comme la VM à 1€ et Hosted Exchange 2010, via un
panneau de contrôle administré en toute liberté par le
client...
PROJETS
14 DOMPDF : créez des PDF à la volée à partir
de HTML
Yohann Poiron
DOMPDF est une bibliothèque écrite en PHP qui permet de générer des documents PDF à partir de pages
web au format HTML, mises en formes avec des feuilles de style CSS. Le respect des standards est le maître-mot de cet outil, qui évolue vers sa version 0.6. Le
projet, très actif et hébergé sur Google Code est maintenu par des passionnés du web et des standards actuels.
5/2011
Table des matières
DOSSIER
20 Mise en œuvre de XAMPP
Olivier Heurtel
XAMPP est un kit d’installation qui inclut entre autres
Apache, PHP et MySQL, et qui permet de mettre en
place très rapidement un environnement de développement Web. Dans cet article, vous apprendrez comment
installer et administrer XAMPP pour Linux, mais aussi
comment développer et déployer une petite application
de test utilisant une base de données MySQL.
PRATIQUE
30 SQL : les vues
Cilia Mauro, Magali Contensin
Savoir manipuler les vues permet de limiter l’accès à un
sous-ensemble de données pour une catégorie d’utilisateurs, de simplifier l’interrogation de la base et d’être
indépendant du schéma relationnel en cas de modification de ce dernier.
35 Créer son site internet avec le CMS eZ
Publish
Jean-Luc Nguyen
Créer un site internet, qu’il soit à titre personnel ou professionnel, peut passer par le choix d’un CMS plutôt
qu’un Framework. Que ce soit un blog sur un musicien
qu’on apprécie, un portail institutionnel ou un site de
vente de T-shirts en ligne, il est nécessaire de connaître
les forces et faiblesses des CMS pour voir un jour son
site internet en ligne sans problème. Dans ce cas, choisir EZ Publish peut être un choix judicieux.
SÉCURITÉ
46 PF et OpenBSD adapté aux PME
Beaucoup de PME ont en commun des besoins de
sécurité et notamment en matière de pare-feu. Il existe de nombreux choix matériels sur le marché et les
UTM ont depuis plusieurs années inondé le marché de
la sécurité internet. Dans cette multitude de choix, il existe des outils Open Source en licence libre qui peuvent
parfaitement convenir aux PME, couvrir 100% de leurs
besoins, tout en étant simples à configurer.
Actualités
Tour PHP 2011
L’AFUP (Association française des
Utilisateurs de PHP) ont annoncé le
premier Tour PHP 2011 à Euratechnologie de Lille le 24 et 25 novembre
2011. A cette occasion, un appel à
conférencier a été lancé avec comme
thématique principale : le commerce
en ligne, l’intégration d’applications
hétérogènes au sein des systèmes
d’informations, l’échelle du web.
http://afup.org/pages/phptourlille2011/
Nginx 1.0
Nginx est un serveur HTTP libre, open
source et haute performance, dont
la version 1.0 vient de sortir après de
nombreuses années de développements. Il permet de faire tourner de
nombreux langage comme PHP. Certaines plateformes l’utilisent comme
Wordpress, Github. Enfin, Nginx est
classé en 3eme position au niveau des
baromètre serveur.
http://nginx.org/
Phrozn
Phrozn est un projet PHP, dont le but
est de vous permettre de générer un
site statique en PHP. Il offre de nombreuses possibilités pour l’intégrer
dans les moteurs de template comme
Smarty, tout en gardant la main sur
les fichier CSS, JS, HTML.
http://www.phrozn.info/en/
PHPMyCom 2.0
MyPhpCom est une application réalisée en PHP, MySQL et Ajax. Il s’agit
d’un système de gestion de commentaires. Cette version se veut la plus
simple possible pour vous permettre
de l’installer facilement dans votre
projet web. Elle propose un captcha,
un système de pagination, les URLs
cliquables...
http://www.phpcs.com/codes/MYPHPCOM-SYSTEME-COMMENTAIRE-PHPMYSQL_52995.aspx
Dolibarr 3.0
La nouvelle version ERP/CRM Dolibarr, vient de sortir. Elle apporte de
nombreuses évolutions et nouveautés comme l’amélioration de la sélection des plugins, de l’installation, de
l’utilisation, et de la programmation.
Par ailleurs, l’organisation des lignes a
été modifiée et de nouveaux modules
sont disponibles.
http://www.dolibarr.org/
Sismo
Le projet sismo est un serveur de tests en continu, écrit en Fabien Potencier (créateur du framework symfony) en PHP et nécessite une version PHP
5.3.3 minimum, pour vous permettre d’effectuer des tests. Par ailleurs, il a
été optimisé pour fonctionner aussi bien sur un serveur local, que sur un
serveur distant.
Son but consiste
àe vous aider dans
la livraison de paquets de développement et sera un
outil complémentaire à votre serveur d’intégration
continue. Lors de
son utilisation, vous pourrez l’associer à tous vos
COMITs. La configuration nécessite juste de mettre le fichier dans le bon dossier de votre
projet et il s’occupera d’effectuer le reste. L’interface web qui vous est proposée, vous sera utile, si vous le souhaitez, lors de son installation et de
son utilisation.
Le site officiel du projet propose un tutoriel et un exemple d’utilisation pour
vous faciliter l’utilisation http://sismo-project.org/
Technologies utilisées
Lors de la navigation, vous pouvez vous retrouver devant un site web qui vous impressionne. Un des premiers réflexes consistent à regarder et analyser
les différentes pages par l’intermédiaire des fichiers sources. Mais souvent la
technologie ou le langage utilisé n’est pas toujours évident à détecter.
Wappalyzer est une extension compatible avec les navigateurs Mozilla
Firefox et Google Chrome. Grâce à celle-ci, vous allez repérer facilement
différents critères :
• Le type de CMS utilisé, les webs frameworks ou JS, les vidéo players,
des widgets, etc
• Des logiciels applicatifs ou la présence d’applications extérieures ou
webs services
Bien sûr, vous pourrez aussi connaître d’autres secteurs comme le e-commerce, le type de javascript, les outils d’analyses, les bases de données et beaucoup d’autres informations utiles. L’ensemble du résultat est disponible directement dans votre navigateur et ainsi vous évitez des opérations manuelles.
http://wappalyzer.com/
Rédaction des actualités :
Christophe Villeneuve
6
5/2011
Premier intégrateur européen
de solutions open source
née
l'an
née
l'an
Élu Part
en
europée
n
re
i
a
de
européen
re
i
a
de
Élu Part
en
Smile c'est aujourd'hui 500 collaborateurs,
11 agences et 18 domaines d'expertise.
Spécialiste reconnu !
Spécialiste reconnu !
Smile recrute 200 personnes en 2011.
Passionnés des technologies du web
et de l’open source ?
Rejoignez nous !
open
source
www.smile.fr
Paris
Lyon
Nantes
Bordeaux
Montpellier
Aix
Barcelone
Kiev
Genève
Casablanca
Amsterdam
Interview
Interview
de François-Xavier Bois, Directeur
associé de Kernix Software
François-Xavier Bois
Directeur associé de Kernix
Software
PHP Solutions : Bonjour, pourriez-vous nous dire quelques mots
sur vous et votre entreprise ?
François-Xavier Bois : Je me présente, François-Xavier Bois, ingénieur en
Sciences Cognitives et Intelligence Artificielle, dirigeant et co-fondateur de
Kernix, société que j’ai créée avec mon associé, Fabrice Métayer, il y a 10 ans
alors que nous étions tous 2 en dernière année à l’EPITA.
Notre structure compte aujourd’hui une trentaine de collaborateurs tous spécialistes dans leur domaine. Notre parti pris a toujours été de maitriser à 100%
nos réalisations en ne faisant appel ni au offshore ni à des profils indépendants. Nous disposons ainsi d’une structure à taille humaine solide en mesure
de s’attaquer à tout projet web quelle que soit sa dimension et sa complexité.
Alors que mon associé assure les directions financière et commerciale, je
suis pour ma part responsable de la division R&D et ai obtenu que Kernix
soit agréée Centre de Recherche par le Ministère de la Recherche. Au sein
de ce pôle je suis l’architecte principal du framework web KWO (Kernix Web
Object) que nous enrichissons à un rythme soutenu depuis la naissance de
Kernix.
Passionné par le web et son écosystème, j’ai eu l’occasion d’écrire 6 ouvrages consacrés au PHP et à MySQL. Le dernier en date, publié chez Eyrolles en décembre 2010, est consacré à WordPress3.
PS : Quels sont aujourd’hui les services que Kernix proposent à ses
clients ?
FXB : Le cœur de notre activité est le développement d’applications web surmesure. Disposer de notre framework nous permet de coller au plus prés des
besoins de nos clients tout en assurant des délais de réalisation les plus compacts possibles. Notre intervention ne se limite cependant pas au développement ; nous accompagnons le client durant toute la phase d’exploitation de son
site en incluant dans notre offre l’hébergement, le référencement et la maintenance. Nous disposons également d’un studio de créa en interne et sommes
ainsi en mesure de proposer le design du site.
PS : Pourriez-vous raconter à nos lecteurs sur quels projets vous
êtes en train de travailler ?
FXB : Kernix intervient en ce moment sur trois typologies d’applications web :
des réseaux sociaux, des moteurs de recherche, liés à géolocalisation et aux
Google Maps, et des boutiques e-commerce. Lauréat en 2009 de l’appel à
projet WEB2.0 organisé par le Secrétariat d’Etat chargé de la prospective et
du développement de l’économie numérique, Kernix est également en train
de réaliser un portail référençant tous les lieux disposant d’installations acces-
8
5/2011
Interview
sibles aux handicapés en France. La base de données
qu’exploitera ce site sera ouverte et accessible via des
webservices.
PS : Comment vous différenciez-vous ?
FXB : En réalisant des sites et applications web depuis
plus de 10 ans, Kernix a très vite pu détecter les véritables enjeux pour les sites web professionnels. Les
notions de robustesse, de sécurité et d’évolutivité sont
au cœur de nos développements. Un développeur ne
conçoit pas de la même façon une interface qui liste
quelques centaines d’éléments ou plusieurs dizaines
de millions. De la même manière, un site disponible
dans une seule langue ne pourra être conçu comme
un site multilingue. Kernix dispose désormais d’une
longue expérience dans la conception de sites critiques
et complexes. Nos clients, dont l’activité repose de plus
en plus souvent à 100% sur nos outils, peuvent compter sur nous et faire appel à tout moment à nos équipes
pour faire évoluer l’applicatif ou l’infrastructure.
PS : Quel est selon vous l’avenir de PHP dans le
monde web ?
FXB : Les qualités qui ont fait la force de PHP sont
toujours présentes aujourd’hui, qu’il s’agisse de l’extrême simplicité du langage, de sa rapidité d’exécution, de sa stabilité ou de sa sécurité intrinsèque. Le
tour de force est d’être parvenu à les maintenir tout en
enrichissant le langage de fonctionnalités avancées
telles que le Late State Binding, les closuresou les namespaces. Ces fonctionnalités permettent de concevoir des frameworks web (Zend, KWO, Symphony) de
haut niveau qui sont désormais à la base de tout projet
web d’envergure.
PS : Aucun regret ?
FXB : Le manque de visibilité sur les évolutions et
l’avenir du langage à moyen et long terme est ma principale inquiétude vis-à-vis de PHP. Quelle solution va
être proposée pour une gestion sérieusede l’unicode ?
Quid de PDO qui devait être au cœur de tous les développements liés aux bases de données ? Quand pouvons-nous espérer voir le compilateur d’opcode APC
faire son entrée dans le tronc commun des sources ?
L’essentiel de l’énergie des développeurs semble désormais être consacré aux frameworks et autres outils utilisateurs. Bien que cela ne soit pas préjudiciable
pour l’instant, je pense qu’il est important de rester vigilant et de ne pas se reposer trop longtemps sur ses
lauriers.
PS : Pourriez-vous raconter à nos lecteurs quels
outils de développement vous utilisez ?
FXB : Chez Kernix, les développeurs sont libres d’utiliser les outils qu’ils souhaitent du moment que la
phpsolmag.org/fr
norme interne d’indentation soit respectée (il y a des
sujets avec lesquels on ne rigole vraiment pas !). La
majorité des développeurs, aficionados de Linux, utilise des terminaux et emacs. Nous trouvons cependant d’autres IDE ou éditeurs tels que Dreamweaver
CS5, IntelliJ, Zend Development Environment ou Notepad++. Kernix n’a pas résisté au tsunami Apple et
les premiers OSX commencent à faire leur apparition
dans l’openspace.
PS : Quels sont les projets à venir de Kernix ?
FXB : En modifiant notre baseline de web application
provider à digital factory nous marquons le fait que
Kernix est plus qu’une agence web. Nous disposons
depuis prés d’un an d’un pôle développement mobile
qui conçoit des applications iPhone et Android. Notre
discours vis-à-vis de nos clients est maintenant le
suivant : Kernix conçoit des solutions digitales complètes qui incluent le gestionnaire central de données
(le backoffice) ainsi que les différentes applications
de consultation que ce soit pour le web, le mobile ou
les tablettes. L’idée est une nouvelle fois de simplifier
la vie du client en facilitant la gestion de données tout
en faisant en sorte que ces dernières soient diffusées
de la manière la plus large possible.
Le support de l’HTML5 par tous les navigateurs
récents est une opportunité magnifique de proposer
des interfaces plus ergonomiques à nos utilisateurs.
Nous sommes à ce titre en train de finaliser la refonte
complète de notre backoffice autour de cette technologie.
PS : Quelles sont vos perspectives de
recrutement cette année ?
FXB : La croissance de Kernix s’est particulièrement
accélérée ces deux dernières années. Nous sommes
en permanence à la recherche de profils pointus dans
le domaine du développement web et mobile. La maitrise de la programmation objet est essentielle. Une
bonne connaissance du JavaScript est clairement un
atout et le sera de plus en plus avec la montée en puissance de l’HTML5.
Chefs de projets et ingénieurs avant-vente sont également des profils pour lesquels nous sommes en recherche active.
Je profite également de cette tribune pour indiquer
que nous sommes à la recherche d’un profil de type
chercheur (postdoc) dans le domaine du datamining.
PS : Merci beaucoup pour le temps que vous
avez bien voulu nous accorder.
FXB : Merci à PHP Solutions que j’ai le plaisir de lire
tous les mois et longue vie au PHP !
9
Interview
Interview
de Florent Sabourin, Responsable
de l’offre e-commerce chez Smile
Florent Sabourin
Responsable de l’offre
e-commerce chez Smile
Contact :
Smile
48 rue de Villiers
92300 Levallois-Perret
Tél. 01 41 40 11 00
PHP Solutions : Quels sont les éléments clés à prendre en compte pour
réaliser un bon site e-commerce ?
Florent Sabourin : Se lancer dans l’e-commerce c’est un peu comme ouvrir
un magasin, il faut étudier le marché, avoir des bons produits et les commercialiser auprès des clients. On peut regrouper tous ces aspects sous le terme
«stratégie e-business», et nous pouvons assister nos clients dans ce sens
pour élaborer leur stratégie, produire un cahier des charges.
Une fois que les idées sont claires, vient le temps de la construction : imaginer
le rayonnage, le placement des produits, les têtes de gondoles, les couleurs de
l’enseigne... Sur le web nous avons des ergonomes, des graphistes et des consultants qui mettent en place ce merchandising et le valident par des tests utilisateurs.
Nos ingénieurs intègrent les écrans et fonctionnalités imaginées, mettent en
place des outils comme Magento qui permettront au marchand d’animer le
catalogue, faire des promotions, gérer les ventes, la logistique, le paiement
en ligne, le SAV... et bien entendu, connectent la plateforme Web au système
d’information en place (ERP, CRM). Nous intervenons également pour former
les utilisateurs, ou les développeurs à la plateforme ainsi construite.
Malgré tout, la réussite d’un commerce en ligne n’est pas uniquement liée à
sa bonne conception : il faut des clients, et des clients contents. Nos consultants en e-marketing appuyés par nos partenaires travaillent sur la médiatisation du site (affiliation, référencement, réseaux sociaux) et proposent des solutions pour améliorer la dimension sociale du shopping.
Challenge réussi : vous avez des milliers ou millions de visiteurs...
En pleine période de soldes, il faut aussi être certain que la quantité de clients attirés
ne trouble pas la bonne marche de la boutique (on voit souvent aux JT des clients
jouer des coudes pour rentrer le premier). Sur le web, le phénomène n’est pas visible mais la problématique reste la même : il faut absorber ce trafic. Notre pôle hébergement, surveillance et exploitation maitrise particulièrement bien ce sujet.
Vient le temps de l’analyse, du pilotage : si les outils d’analyse sont excellents pour mesurer le comportement des internautes, nous proposons également de les coupler avec des solutions de Business Intelligence qui offrent
une grande liberté dans l’analyse des données, des clients, des ventes, de la
qualité de service... Et cela dans un but unique : améliorer en permanence la
performance commerciale de la e-boutique.
En synthèse nous aidons nos clients à lancer leur activité, mettre en place
leur boutique, se faire connaitre et piloter ce canal de vente en vogue.
PS : Pourquoi avoir fait le choix de l’Open Source ?
FS : Les solutions open source, lorsqu’elles sont matures (et c’est le cas pour
le e-commerce) offrent un très grand nombre d’avantages pour nos clients. On
10
5/2011
Interview
parle souvent du prix qui est bien évidemment un critère
de choix important. Mais s’il est vrai qu’une solution open
source est très souvent moins couteuse qu’une solution
propriétaire, ce n’est pas pour nous l’unique argument à
retenir.
Le monde du e-commerce va vite, très vite. Des nouveautés, il en sort tous les jours et les e-commerçants
doivent se maintenir à la page pour rester concurrentiels. Prenons par exemple Google Shopping qui est arrivé en France cette année. Les premiers outils à avoir
offert des fonctions d’export natives vers le moteur de
Google étaient des solutions open source (Magento notamment). Et ce, grâce à la réactivité et à la taille de
la communauté entourant l’outil. Pas question, sur ce
genre de fonctionnalités valorisant les primo-entrants,
d’attendre qu’un éditeur intègre cette fonctionnalité à sa
roadmap et la publie deux, trois voire six mois plus tard !
Vient ensuite la question de la pérennité. L’émergence
de solutions open source portées par des éditeurs (des
sociétés à but lucratif donc) permettent aujourd’hui aux
sociétés les plus réticentes de trouver un modèle alternatif combinant le meilleur des deux mondes : l’ouverture et le support communautaire d’un côté et la présence de forces de production dédiées à maintenir et à
faire évoluer l’outil de l’autre.
PS : Quelles sont les principales références clients de
l’offre e-commerce Smile, les grands projets menés
récemment ?
FS : En 2009, nous avons mis en ligne le site marchand du Furet du Nord (www.furet.com), une des plus
grandes librairies d’Europe basée dans le nord de la
France. Cette boutique en ligne réunit plus de 1 400 000
références et reste encore aujourd’hui le plus gros catalogue jamais mis en ligne sous Magento. C’était un
challenge technique passionnant !
Nous avons également accompagné dans la refonte
de son site e-commerce le multi-spécialiste de l’équipement public camif-collectivites.fr.
Fin 2010, nous avons mis en ligne le site des grandes
marques comme La Halle, Minelli, le célèbre libraire Gibert Joseph ou encore le savoyard SnowLeader.com
(matériels, vêtements et chaussures lifestyle).
Début 2011 nous sommes fiers d’avoir mis en ligne
le premier site marchand d’un réseau d’opticiens : Krys
(www.krys.com). Nous venons également de sortir le
nouveau site de la marque de lingerie Darjeeling (www.
darjeeling.com). Beaucoup d’autres beaux projets sont
à venir en 2011.
PS : Quels outils préconisez-vous ?
FS : Magento est le leader incontesté sur le marché des
solutions e-commerce open source. Nous avons un excellent pôle de compétence sur ce produit et réalisons
la plupart de nos sites avec cette solution.
phpsolmag.org/fr
Prestashop avec ses dernières versions devient une
alternative très sérieuse, nous suivons ce produit de
près depuis 2008 et commençons à l’intégrer.
D’autres solutions comme RBSChange ou encore Drupal Commerce - sur lesquelles nous comptons à l’avenir
- sont suivies par notre équipe de veille technologique.
Pour en savoir plus vous pouvez télécharger gratuitement notre livre blanc sur le sujet sur www.smile.fr.
PS : Comment expliquez-vous le succès de ces deux
solutions ?
FS : Les deux solutions sont sorties à peu près à la
même époque (premier semestre 2008) et ont comblé
un vide dans l’offre open source laissé par un OsCommerce techniquement en déclin et à la communauté déchirée entre un nombre incalculable de forks.
Magento, lors de sa sortie a bénéficié d’un buzz absolument incroyable sans grands efforts de la part de
Varien (éditeur de Magento). La qualité intrinsèque de
l’outil, tant sur le plan ergonomique, technique et fonctionnel a permis à Magento de décoller instantanément
et d’installer en un temps record une base d’utilisateurs
suffisante pour attirer l’attention de sociétés plus importantes. En France, c’est Discounteo qui a franchit le pas
en premier, ouvrant la voie à de nombreuses autres
grandes implémentations.
Prestashop a mis un peu plus de temps à démarrer.
La solution est sortie légèrement après Magento et a
longtemps souffert d’une image plus amateur à côté de
son aîné américain. Mais l’éditeur français à déployé
des efforts colossaux pour mettre à niveau sa solution
et bénéficie aujourd’hui d’une incroyable base de boutiques installées dans le monde. S’il fallait désigner un
vrai successeur à OsCommerce, c’est bien Prestashop !
PS : Quelles sont les perspectives pour l’année 2011
sur le marché de l’e-commerce et pour Smile en
particulier ?
FS : Smile travaille d’ores et déjà à la construction et
à la refonte de e-boutiques pour des marques ou des
distributeurs qui verront le jour d’ici les prochains mois.
Nous pensons que le marché du m-commerce, via
les smartphones, va continuer de croître et prendre
une place importante dans les usages d’Internet. Nos
équipes travaillent sur le développement d’applications mobiles et de sites mobiles pour accompagner les
clients de nos clients.
Comme j’ai pu en parler précédemment, le Social
Shopping est clairement un axe de développement fort
pour nos clients, notamment les marques. L’arrivée de
la Freebox 6 baptisée Révolution et l’amélioration globale des boitiers TV rendent actif le consommateur et
laisse penser que le T-commerce va être un concept à
exploiter dans quelques années.
11
Outils
Les solutions Cloud à l’usage d’Ikoula
Ikoula, hébergeur informatique depuis 1998, est le leader du Cloud Computing en France. Avec plus
de 8 000 machines virtuelles en production et plusieurs années d'expérience dans la virtualisation,
Ikoula développe des solutions de Public et de Private Cloud, comme la VM à 1€ et Hosted Exchange
2010, via un panneau de contrôle administré en toute liberté par le client...
La VM à 1€, un serveur dédié virtuel 100% flexible
La VM à 1€ a été conçue pour apporter aux utilisateurs un
maximum de flexibilité et d’élasticité dans la consommation de
leurs ressources.
Elle inclut une franchise à 1€ comprenant :
o 512 Mo de RAM
o ½ CPU
o 40 Go d’espace disque
o 240 Go de données entrée/sortie
o 128 Kb/s de bande passante entrante et 512Kb/s de bande
passante sortante
Ce sont ces mêmes indicateurs qui sont ensuite facturés selon leur surconsommation ; chacun
possédant son propre prix.
La VM à 1€ : comment ça marche ?
Avant de souscrire à la prestation, l’utilisateur a la possibilité d’estimer ces coûts de consommation
mensuels via une calculatrice conçue spécialement pour cet usage (disponible sur
http://express.ikoula.com/vm).
Lors de sa souscription, l’utilisateur définit un plafond maximum de consommation pour deux
indicateurs : la RAM (disponible en 512 Mo, 758 Mo, 1024 Mo ou 2048 Mo) et le disque dur (100 ou
200 Go). Si ces quantités sont dépassées dans le mois, la VM s’ajuste automatiquement d’elle-même,
aucune manipulation n’est nécessaire.
L’utilisateur choisit ensuite son système d’exploitation parmi les dernières versions disponibles sous
Windows : Web Edition 2008 R2, Standard Edition 2008 R2, Data Center Edition 2008 R2, Enterprise
Edition 2008 R2… Le coût des licences n’est pas facturé !
La VM est disponible en quelques minutes ! L’utilisateur a la possibilité de consulter ces en-cours de
consommation en temps réel via une interface conçue spécialement pour les offres Cloud Computing
d’Ikoula.
La VM à 1€ : pour quel type d’utilisation ?
La VM à 1€ est idéale pour des opérations ponctuelles du type événementiel, calculs intensifs,
opérations marketing, web, jeux… Elle peut s'élargir sur la période correspondante et retrouver une
taille plus "standard" à son échéance. Elle est donc totalement flexible et modulable.
12
5/2011
Les solutions Cloud à l’usage d’Ikoula
Exchange 2010, la solution de messagerie pour les revendeurs
L’offre Hosted Exchange 2010 d’Ikoula connaît une double
particularité : la possibilité de revendre la solution en marque
blanche et de se constituer des comptes sur-mesure.
Avec la plate-forme EX10, vous êtes le seul maître à bord
Pour permettre à ses clients de devenir eux-mêmes revendeurs de la solution, Ikoula a développé une
interface de gestion facile d’utilisation et intuitive, à travers laquelle il est possible de gérer et de
paramétrer l’ensemble des fonctionnalités proposées par Exchange 2010.
Ainsi, création de comptes de messageries, d’utilisateurs, partage d’agendas, de calendriers, accès
webmail… sont sous le contrôle du revendeur, qui a une utilisation illimitée des fonctionnalités selon
le pack choisi chez l’hébergeur.
Créez vos comptes sur-mesure
Ikoula propose deux packs ayant chacun des fonctionnalités plus ou moins avancées ; l’utilisateur
pouvant changer de pack comme il le souhaite ou payer uniquement les ressources dont il a besoin
en supplément (espace de stockage et synchronisation mobile).
Le Pack Pro : pour profiter des fonctions standards d’Exchange (POP, IMAP, partage des ressources…)
tout en ayant la possibilité de souscrire à des options payantes comme MAPI ou la synchronisation
mobile… A partir de 0,99€/compte.
Le Pack Entreprise : pour utiliser la version complète d’Exchange 2010, avec toutes les fonctions
indispensables permettant la délégation des ressources, la synchronisation mobile, ou encore
l’utilisation du MAPI ou du mode déconnecté. A partir de 2,99€/compte.
Sont respectivement inclus 1Go et 2Go de stockage, avec la possibilité d’augmenter l’espace à sa
guise (coût au Go supplémentaire).
« Exchange 2010 a été une réponse à un véritable besoin. Chaque
personne a une utilisation bien spécifique de son compte de messagerie
et n’a pas forcément besoin de 25 Go ! Grâce à EX10, les utilisateurs ne
paie que le nécessaire et peuvent réajuster leur stockage à tout
moment. »
Jules-Henri Gavetti, Président d’Ikoula
LES AVANTAGES IKOULA
o
o
o
o
o
Toutes les questions/réponses sur Exchange 2010 disponible en ligne
Antispam et antivirus inclus
Offre découverte : 1 mois d’Hosted SharePoint offert (100 Mo, 1 site, 1 utilisateur)
Des vidéos et une documentation complète pour guider l’utilisateur dans la découverte et
l’utilisation de l’interface de gestion EX10
Une infrastructure haute disponibilité avec des équipements redondants
phpsolmag.org/fr
13
Projets
dompdf : créez des PDF à la
volée à partir de HTML
DOMPDF est une bibliothèque écrite en PHP qui permet de
générer des documents PDF à partir de pages web au format
HTML, mises en formes avec des feuilles de style CSS. Le respect
des standards est le maître mot de cet outil, qui évolue vers sa
version 0.6. Le projet, très actif et hébergé sur Google Code est
maintenu par des passionnés du web et des standards actuels.
Cet article explique :
Ce qu’il faut savoir :
•
•
•
•
•
• Des notions sur les technologies Web.
• Des notions de Programmation Orientée Objet.
La présentation du projet dompdf.
Comment utiliser dompdf ?
Fonctionnement de dompdf.
Des exemples de productions PDF.
dompdf et les CMS.
d
ompdf est un convertisseur de HTML vers PDF écrit
en PHP, qui essaie de respecter au mieux les styles
CSS tout en assurant des fonctionnalités utiles pour
l’impression (saut de page, numéro de page, couleurs
CMJN, formats de page, résolution des images, etc).
Le principe de cette bibliothèque est de parcourir les
feuilles de style externes ou inline, les balises, et les
attributs des éléments HTML pour ensuite les insérer
dans le document PDF résultant. Il supporte également
la plupart des attributs de présentation pour rester com�
patible avec les documents HTML sans styles CSS mais
dont la mise en forme passe par des attributs HTML 4.
Cette bibliothèque a longtemps été à l’abandon sur
SourceForge, mais elle est depuis plus d’un an main�
tenant hébergée sur Google Code (http://code.google.
com/p/dompdf/) où elle est actuellement maintenue par
de nouveaux développeurs.
Ce projet s’adresse aux développeurs Web qui de pré�
férence travaillent sur un projet libre en PHP, et qui veulent
convertir des pages simples ou des documents complexes
de manière à ce qu’ils respectent au mieux les standards
du W3C. Je ne cache pas que DOMPDF comporte en�
core quelques lacunes, du fait qu’il est encore jeune, no�
tamment quelques problèmes de performances dans des
documents trop complexes, mais la dernière version beta
sortie il y a un mois en corrige une partie.
Le projet étant Open Source, tout le monde peut
l’inclure dans son projet et vendre son produit par la
14
suite. En effet, si ce dernier respecte la licence (GNU
GPL) cela permet à l’auteur la vente de ses logiciels
����������������������������������������������������
condition de fournir aussi le code source, garantis�
sant juste des libertés sur l’œuvre une fois celle-ci
obtenue.
Actuellement le développement du projet est assuré
par deux personnes : Brian Sweeney et Fabien Ména�
ger. Ryan Masten, qui a relancé le projet en 2009, n’est
plus très actif, et c’est donc Fabien et Brian qui gèrent le
projet. D’ailleurs ils aimeraient être plus nombreux pour
accélérer le développement et la sortie des versions,
car le travail fourni n’est qu’en partie dans un cadre pro�
fessionnel, pour corriger seulement les bugs bloquants,
le reste s’effectuant durant leur temps libre.
Comment utiliser dompdf ?
Nous allons voir pas ���������������������������������
�������������������������������
pas comment réaliser la conver�
sion d’un fichier HTML en PDF à l’aide du langage PHP
et de la bibliothèque dompdf. Commencez par créer un
fichier que l’on nomme test_dompdf.html. Nous allons y
inclure le code du Listing 1.
Ce fichier est très simple, c’est la partie visuelle du
rendu. Ainsi nous déclarons seulement un paragraphe
(<p>) avec un contenu, sans style pour le moment.
Nous allons maintenant entrer dans le vif du sujet avec
la création du fichier PHP. Pour cela, créez un fichier
que l’on nomme test_dompdf.php. Dans celui-ci nous
allons mettre le code du Listing 2.
5/2011
DOMPDF
La premi�����������������������������������������������
���������������������������������������������
re ligne permet d’inclure le fichier de confi�
guration de dompdf dompdf_config.inc.php. Il s’occupe�
ra d’inclure les classes de dompdf. Puis, on instancie la
classe DOMPDF et on charge le fichier HTML. Deux mé�
thodes sont possibles : load_html_file ou load_html.
La premi�������������������������������������������
�����������������������������������������
re comme son nom l’indique permet de char�
ger un fichier HTML en passant en argument le fichier.
Quant à la seconde, elle charge directement le contenu
HTML plutôt que le fichier lui-même.
Ensuite il s’agit de la configuration du format de papier
($dompdf->set_paper(„a4”, „landscape”);) que l’on dé�
sire. Ici j’ai choisi le format A4 avec une orientation en pay�
sage. D’autres formats sont disponibles et il est également
possible de définir votre propre format en pt (point).
L’avant derni�������������������������������������������
�����������������������������������������
re opération traite récursivement les dif�
férents éléments de la DOM du fichier HTML. Pour finir,
nous envoyons le flux PDF directement vers le navi�
gateur. Pour cela, nous utilisons l’instruction suivante :
$dompdf->stream(„document.pdf”,
array(„Attachment”
=> true));.
Bien s����������������������������������
û���������������������������������
r vous avez la possibilité de dé�
poser le fichier directement sur un répertoire de
votre serveur en utilisant le code suivant : file_put_
contents(„document.pdf”,
$dompdf->output());. En
effet, la méthode file_put_contents permet d’écrire le
contenu passé en paramètre dans un fichier.
Tout un tas d’options sont possibles, pour plus
de détails : http://code.google.com/p/dompdf/wiki/
Usage#Using_the_dompdf_class_directly . Et voilà,
votre PDF est généré, comme le montre la Figure 1.
Rien de compliqué, n’est-ce pas ? Notez que si le docu�
ment avait comporté des balises <style> ou des styles
inline, ils auraient été pris en compte.
Fonctionnement de dompdf
dompdf étant en fait un moteur de rendu HTML avec
comme support un document PDF, il suit les mêmes
Listing 1. Document HTML à convertir
<!DOCTYPE html>
<html lang=”fr”>
<head>
<title>Page de Test HTML - dompdf, un outil puissant pour convertir de l’HTML vers PDF en PHP</title>
</head>
<body>
<p>
Cette page <em>HTML</em> va etre convertie a l’aide de <em>dompdf</em> en <em>PDF</em>
</p>
</body>
</html>
Listing 2. Instanciation de l’objet DOMPDF
require(“repertoire/de/dompdf/dompdf_config.inc.php”);
$dompdf = new DOMPDF();
$filename =
“test_dompdf.html”
$dompdf->load_html_file($filename);
// OU si vous avez acces au contenu HTML plutot qu’au fichier HTML lui-meme
//$dompdf->load_html($html);
// d’autres formats sont dispo, il est aussi possible de définir un format en “pt”
$dompdf->set_paper(“a4”, “landscape”);
$dompdf->render();
// Si vous voulez le faire télécharger par le navigateur
$dompdf->stream(“document.pdf”, array(“Attachment” => true));
// OU si vous voulez le mettre dans un ficher sur le serveur
// file_put_contents(“document.pdf”, $dompdf->output());
phpsolmag.org/fr
15
Projets
principes qu’un moteur de rendu HTML classique, tout
en utilisant ce que PHP lui met à disposition.
Le processus peut se résumer en quelques étapes
malgré sa complexité :
• le document HTML est chargé par l’extension DOM
de PHP, un arbre DOM est alors construit,
• un arbre de Frames est construit, à�����������������
������������������
l’image de l’ar�
borescence des éléments de la DOM, ces Frames
sont les briques de base de dompdf, et gardent un
lien vers leur élément de DOM correspondant,
• la feuille de style CSS par défaut (qui était d’ailleurs
à la base une copie de celle de Mozilla Firefox 1.0)
et toutes les feuilles de styles trouvées dans les do�
cuments et les styles inline sont alors parcourus et
analysés par un Parser de CSS,
• une fois les feuilles de style analysées, tous les
sélecteurs CSS sont transformés en expressions
XPath pour créer un Style pour chaque Frame en
passant par l’arbre DOM du tout départ et son mo�
teur Xpath,
• chaque Style permettra de définir à quel type de
FrameReflower, FramePositioner et FrameDecorator seront associées chaque Frame. Ces trois élé�
ments seront le ciment qui feront correspondre les
briques Frame. Nous détaillerons un peu plus tard
leurs différences,
• tout est maintenant pr�����������������������������
���������������������������
t pour laisser la magie opé�
rer : on lance le reflow de la Frame racine, qui va
récursivement lancer celui des autres Frames,
• à la fin du reflow de chacune des Frames, un Renderer est créé en fonction encore une fois du style :
c’est la peinture du mur de briques. C’est à�������
��������
ce mo�
ment là que dompdf écrit dans le fichier PDF,
• à chaque changement de page, les Frames, leur
élément de DOM et leur FrameReflower, FramePositioner, FrameDecorator et Renderer sont détruits
pour récupérer des ressources.
Une grande partie de ces principes provient du site
du W3, notamment http://www.w3.org/TR/CSS2/visuren.html et http://www.w3.org/TR/CSS2/visudet.html.
Nous avons vu que chaque Frame avait ces trois com�
posants de ciment : FrameReflower, FramePositioner
et FrameDecorator.
Chacun d’entre eux a la même importance et forme
un tout pour réaliser un rendu correct. Le choix de cha�
cun de ses types est déterminé par le style qui leur est
appliqué, notamment leur display. Plutôt qu’un long dis�
cours, le Listing 3 présente une partie du code du FrameFactory de dompdf qui s’occupe de faire ces choix.
Commençons par le Reflower. Celui-ci va définir
comment chaque Frame va pousser ou encore faire
descendre chacun de ses frères ou ses descendants.
Par exemple un élément de type block ne prendra pas
la même place qu’un élément de type inline. La largeur,
la hauteur ou les marges par exemple seront des styles
déterminants pour cet aspect du rendu.
Ensuite vient le Positioner. Celui-ci définit où sera
placé la Frame, par rapport à ses ancêtres et ses frères.
Pour cet aspect du rendu, le style position ainsi que les
top, right, bottom et left seront à prendre en compte,
entre autres.
Et le dernier composant du ciment : le Decorator,
c’est lui qui contient par exemple les informations de
disposition des lignes de texte d’un élément de type
bloc, ou encore les fonctions de découpage des élé�
ments inline ainsi ce que le soulignement des textes
ou leur alignement. Ce composant agit au sein même
de chaque Frame, à un niveau encore plus bas que la
brique, pour obtenir un bon layout.
Le Renderer quant �������������������������������
�����������������������������
lui va passer un coup de pin�
ceau sur le mur. C’est par ce processus que sera des�
siné le fond des éléments, leurs bords, les textes et les
images. C’est aussi par lui que vont passer les balises
JavaScript que l’on peut inclure, et aussi les scripts
PHP inline (http://code.google.com/p/dompdf/wiki/
Usage#Inline_PHP_support). C’est lors du Rendering
que l’écriture du document PDF est effectuée.
Pour l’écriture du document PDF, dompdf propose
une option qui permet de choisir quel moyen utiliser
(nous appellerons ceci des backend). Trois choix sont
disponibles actuellement :
• la bibliothèque Cpdf, par défaut, qui est embarquée
avec dompdf et écrite en pur PHP,
Figure 1. Résultat de la conversion de l’HTML vers PDF
16
5/2011
DOMPDF
Listing 1. Document HTML à convertir
$style = $frame->get_style();
switch ($style->display) {
case “block”:
$positioner = “Block”;
$decorator = “Block”;
$reflower = “Block”;
break;
case “inline-block”:
$positioner = “Inline”;
$decorator = “Block”;
$reflower = “Block”;
break;
case “inline”:
$positioner = “Inline”;
if ( $frame->get_node()->nodeName === “#text” ) {
$decorator = “Text”;
$reflower = “Text”;
}
else {
if ( $style->float !== “none” ) {
$decorator = “Block”;
$reflower = “Block”;
}
else {
$decorator = “Inline”;
$reflower = “Inline”;
}
}
break;
case “table”:
$positioner = “Block”;
$decorator = “Table”;
$reflower = “Table”;
break;
case “inline-table”:
$positioner = “Inline”;
$decorator = “Table”;
$reflower = “Table”;
break;
case “table-row-group”:
case “table-header-group”:
case “table-footer-group”:
$positioner = “Null”;
$decorator = “Table_Row_Group”;
$reflower = “Table_Row_Group”;
break;
case “table-row”:
$positioner = “Null”;
$decorator = “Table_Row”;
$reflower = “Table_Row”;
break;
phpsolmag.org/fr
case “table-cell”:
$positioner = “Table_Cell”;
$decorator = “Table_Cell”;
$reflower = “Table_Cell”;
break;
case “list-item”:
$positioner = “Block”;
$decorator = “Block”;
$reflower
= “Block”;
break;
case “-dompdf-list-bullet”:
if ( $style->list_style_position === “inside” )
$positioner = “Inline”;
else
$positioner = “List_Bullet”;
if ( $style->list_style_image !== “none” )
$decorator = “List_Bullet_Image”;
else
$decorator = “List_Bullet”;
$reflower = “List_Bullet”;
break;
case “-dompdf-image”:
$positioner = “Inline”;
$decorator = “Image”;
$reflower = “Image”;
break;
case “-dompdf-br”:
$positioner = “Inline”;
$decorator = “Inline”;
$reflower = “Inline”;
break;
default:
case “none”:
$positioner = “Null”;
$decorator = “Null”;
$reflower = “Null”;
break;
}
$position = $style->position;
if ( $position === “absolute” )
$positioner = “Absolute”;
else if ( $position === “fixed” )
$positioner = “Fixed”;
// Ensuite, les 3 variables $positioner, $decorator
et $reflower sont utilisées pour
instancier les objets
17
Projets
Figure 2. Support des transformations 2D CSS
Figure 3. Quelques types de border supportés
18
5/2011
DOMPDF
Sur Internet
•
•
•
•
•
http://www.blog-nouvelles-technologies.fr/archives/2249 – Article complet sur dompdf,
http://www.dompdf.com - Le site web du projet,
http://code.google.com/p/dompdf/source/checkout – Fichiers source du projet,
http://pxd.me/dompdf/www/examples.php – Démonstration en ligne,
[email protected] – Adresse de l’auteur de l’article pour toutes questions ou remarques.
• la PDFLib, gratuite et limitée ou payante et tr������
����
s ra�
pide (car c’est une extension PHP écrite en C),
• ou bien GD, qui permet de faire le rendu sur une
image (PNG, JPEG ou GIF). Ce choix limite le
rendu ���������������������������������������
�����������������������������������������
1 page cependant, et est encore expéri�
mental.
Dans la plupart des cas, Cpdf est suffisant, et c’est lui
qui est le mieux maintenu. La PDFLib peut aussi être
utilisée si le prix de la licence ne vous freine pas.
Et voilà ! Le document est complètement écrit, et
vous connaissez maintenant le fonctionnement de
dompdf, dans les grandes lignes. A titre d’information,
aujourd’hui, ce projet totalise plus de 28 000 lignes de
code PHP (d’après les stats Ohloh : https://www.ohloh.
net/p/dompdf/analyses/latest).
Exemples de productions PDF
Une page d’exemples est mise ���������������������
�������������������
disposition par Fa�
bien, vous permettant de tester tous les exemples four�
nis avec la librairie dans la version du trunk svn.
Voici deux exemples de PDF générés par la librairie
dompdf :
Conclusion
La communauté de dompdf s’étend régulièrement, et le
projet mûrit par la même occasion. La ligne de conduite
principale de ce projet est de rester toujours le plus res�
pectueux des recommandations du W3C, en utilisant
tout ce qui est disponible tant au niveau des normes
CSS que du format PDF pour donner un résultat im�
peccable. Afin d’y arriver encore mieux et d’accélérer
le rythme de développement, l’équipe est pr���������
�������
te ���
�����
ac�
cueillir de nouveaux contributeurs. Bien sûr, si vous
n’avez pas le courage de plonger dans le code de cette
biblioth�����������������������������������������
���������������������������������������
que mais que vous voulez quand m��������
������
me don�
ner un coup de pouce, toutes les remarques seront les
bienvenues.
D’ailleurs si vous voulez retrouver le live tweet du
projet dompdf, ce dernier vient tout juste de s’inscrire
sur Twitter. N’hésitez pas à������������������������������
�������������������������������
le suivre pour toute informa�
tion : @dompdf. Je tiens à remercier Fabien Ménager,
travaillant également à Openxtrem, geek à ses heures
perdues, passionné du Web et de nombreux projets
Web Open Source, qui m’a aidé à réaliser cet article.
• Support des transformations 2D CSS (Figure 2).
• Quelques types de border supportés (Figure 3).
Dompdf et les CMS
Une bibliothèque n’a que peu d’intérêt si elle n’est pas
utilisable dans les systèmes de gestion de contenus,
blogs, ou frameworks existants. C’est pour cela que des
plugins sont disponibles pour quelques-uns de ces sys�
tèmes :
• Symfony : http://www.symfony-project.org/plugins/
sfDomPDFPlugin,
• Drupal : http://drupal.org/project/print,
• SPIP : http://www.spip-contrib.net/3719,
• Typo3 : http://typo3.org/extensions/repository/view/
ke_dompdf/current/,
• Code Ingniter : http://codeigniter.com/wiki/PDF_ge�
neration_using_dompdf/.
D’autres plugins sont sûrement disponibles pour le
système que vous utilisez s’il n’est pas dans cette liste.
Si un plugin n’existe pas, quelqu’un y a sûrement déjà
pensé et peut-être écrit un article sur son blog !
phpsolmag.org/fr
YOHANN POIRON
Autodidacte en matière de développement de sites en PHP, j’ai toujours poussé ma curiosité sur les sujets et les actualités du Web.
C’est ainsi que j’ai récemment créé un blog me permettant de parler de ma veille personnelle et de mon quotidien professionnel autour des réflexions et commentaires sur les thèmes des nouvelles technologies, des services innovant, du développement, de l’interopérabilité dans le domaine médical, des réseaux sociaux et du buzz marketing.
http://www.blog-nouvelles-technologies.fr
Je suis actuellement engagé en tant que responsable interopérabilité et développeur Web pour la société Openxtrem pour laquelle je réalise des développements permettant de commercialiser le
système en tant que pur EAI (Enterprise Application Integration) pour les structures de santé, en faisant l’extraction des fonctionnalités
‚métier’ (bloc, plan de soins, etc...).
http://www.openxtrem.com
19
Dossier
Mise en œuvre
de XAMPP
XAMPP est un kit d’installation qui inclut entre autre Apache,
PHP et MySQL, et qui permet de mettre en place très rapidement
un environnement de développement Web. Dans cet article,
vous apprendrez comment installer et administrer XAMPP pour
Linux, mais aussi comment développer et déployer une petite
application de test utilisant une base de données MySQL.
Cet article explique :
Ce qu’il faut savoir :
• L’installation de XAMPP pour Linux.
• L’administration de XAMPP pour Linux (démarrage, arrêt, sauvegarde).
• Le développement d’une petite application qui accède à une
base de données MySQL.
• La sécurisation de XAMPP pour Linux.
• Les commandes de base sous Linux.
• Les base de la programmation HTML, PHP et SQL.
Présentation de XAMPP
Pour développer une application PHP, il est souvent
nécessaire de disposer d’un environnement compor�
tant au minimum Apache, MySQL et PHP, mais aussi
d’autres briques logicielles pour la génération de do�
cuments PDF, la manipulation de données XML ou le
traitement d’images. M����������������������������������
��������������������������������
me si l’installation et la confi�
guration de ces différents produits n’est pas difficile en
soi cela nécessite un peu de temps.
XAMPP est un kit d’installation d’Apache gratuit qui
contient justement tous les produits nécessaires aux
besoins les plus courants. Ce kit est diffusé par Apache
Friends, un projet sans but lucratif destiné à promouvoir
le serveur Web Apache.
Figure 1. Le logo de XAMPP
20
XAMPP présente de nombreux atouts :
• Il est très facile à installer (télécharger, décompres�
ser, démarrer).
• Il incorpore un très grand nombre de produits et
d’outils utiles pour le développement.
• Il
propose
quelques
petits
programmes
d’exemples.
• Le projet est vivant et propose très régulièrement
de nouvelles versions incluant les mises à jours ré�
centes des différents produits.
XAMPP est
formes :
disponible
pour
plusieurs
plates-
Figure 2. Le répertoire d’installation
5/2011
XAMPP
Figure 3. Démarrage de XAMPP pour Linux
• Linux (testé sous Ubuntu, SuSE, RedHat, Mandriva
et Debian),
• Windows (2000, 2003, XP, Vista et 7),
• Solaris SPARC (version 10),
• Mac OS X (version 10.4 pour Intel & PPC), encore
en version bêta.
Dans cet article, nous nous intéresserons à la mise en
œuvre de XAMPP pour Linux, et plus précisément la
version 1.7.4 sortie fin janvier 2011. Cette derni�������
�����
re in�
clut notamment les produits suivants :
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Apache 2.2.14
MySQL 5.1.41
PHP 5.3.1
Perl 5.10.1
ProFTPD 1.3.2c
phpMyAdmin 3.2.4
OpenSSL 0.9.8l
GD 2.0.1
Freetype 2.1.7
libjpeg 6b
libpng 1.2.12
gdbm 1.8.0
zlib 1.2.3
expat 1.95.2
Sablotron 1.0
Figure 4. Démarrage de XAMPP pour Linux
phpsolmag.org/fr
•
•
•
•
•
•
•
•
•
•
•
libxml 2.7.6
libxslt 1.1.26
Ming 0.4.2
Webalizer 2.21-02
pdf class 009e
ncurses 5.3
mod_perl 2.0.4
FreeTDS 0.63
gettext 0.17
IMAP C-Client 2007e
OpenLDAP (client) 2.3.11
Figure 5. La page d’accueil de XAMPP pour Linux
Figure 6. La page de statut de XAMPP
21
Dossier
Tableau 1. Liste des exemples
Nom
Produits utilisés
Fichier source
Collection de CD
PHP + MySQL + PDF
cds.php
Biorythme
PHP + GD
biorhythm.php
Guest Book
Perl
guestbook-fr.pl
Instant Art
PHP + GD + FreeType
iart.php
Répertoire Téléphonique
PHP + SQLite
phonebook.php
phpinfo()
PHP
phpinfo.php
•
•
•
•
•
•
•
•
mhash library 0.8.18
mcrypt library 2.5.7
cURL 7.19.6
SQLite 2.8.17 (for PHP4 + PHP5)
SQLite 3.6.16 (for PHP5 PDO SQLite)
eAccelerator 0.9.5.3
FPDF 1.6
bzip2 (library) 1.0.5
Sur le site Apache Friends (http://www.apachefriends.org/fr/xampp.html), vous pouvez trouver des infor�
mations sur XAMPP, télécharger la dernière version,
consulter une FAQ et participer ���������������������
�������������������
un forum de discus�
sion. La derni����������������������������������������
��������������������������������������
re version de XAMPP, ainsi que les ver�
sions précédentes, sont aussi disponibles sur Source�
Forge (http://sourceforge.net/projects/xampp/).
Installation sous Linux
Pour installer XAMPP, nous devons nous connecter en
tant qu’administrateur système (root) à notre serveur.
LAMPP ou XAMPP ?
Auparavant ce logiciel s’appelait LAMPP, mais il a été renommé „XAMPP pour Linux” en 2003. Cela explique
pourquoi le répertoire d’installation et le script de contrôle
de XAMPP s’appellent lampp.
Figure 7. L’application de démonstration „Collection de CD”
22
Nous allons commencer par télécharger la version
1.7.4 de XAMPP à partir du site Apache Friends :
wget http://www.apachefriends.org/download.php?xampplinux-1.7.4.tar.gz
Un fois le téléchargement terminé, il suffit d’extraire
l’archive pour installer le produit :
tar xvzf xampp-linux-1.7.4.tar.gz -C /opt
Sur cet exemple, l’option -C /opt permet d’installer
XAMPP sur /opt. Vous devriez obtenir l’arborescence
suivante sur /opt (voir Figure 2).
Il ne reste plus qu’à démarrer XAMPP (voir Figure 3) :
/opt/lampp/lampp start
Et voilà, c’est (déjà) fini, il ne reste plus qu’à vérifier
que tout fonctionne correctement en démarrant votre
navigateur préféré et en saisissant l’URL http://localhost si vous êtes en local ou http://serveur à partir
d’une autre machine. Vous devriez voir apparaître une
page qui permet de choisir le langage à utiliser (voir
Figure 4).
Cette page est affichée uniquement lors du premier
acc�����������
���������
s ��������
������
XAMPP ; ������������������������������������
le langage sélectionné est mémori�
Figure 8. Exemple de résultat obtenu avec l’application de
démonstration „Instant Art”
5/2011
XAMPP
sé sur le serveur dans le fichier /opt/lampp/htdocs/xampp/lang.tmp. Une fois le choix de la langue effectué, la
page d’accueil de XAMPP devrait s’afficher (Figure 5).
C’est tout bon !
Petit tour du propriétaire
La page d’accueil de XAMPP
La page d’accueil de XAMPP contient plusieurs liens
qui permettent de vérifier l’état du logiciel, de tester les
Tableau 2. Principaux répertoires et fichiers
Répertoire/Fichier
Contenu
/opt/lampp/backup/
Répertoire de destination des sauvegardes.
opt/lampp/bin/
Répertoire des exécutables et fichiers de commandes fournis avec
XAMPP. Vous y trouverez par exemple les utilitaires de MySQL (mysql,
mysqldump, etc.), ceux d’Apache (apachectl, htpasswd, etc.), et bien
d’autres.
/opt/lampp/htdocs/
Répertoire racine du serveur Web Apache (DocumentRoot).
/opt/lampp/etc/
Répertoire des fichiers de configuration des différents produits (voir
ci-dessous).
/opt/lampp/etc/httpd.conf
Fichier de configuration d’Apache.
/opt/lampp/etc/my.cnf
Fichier de configuration de MySQL.
/opt/lampp/etc/php.ini
Fichier de configuration de PHP.
/opt/lampp/etc/proftpd.conf
Fichier de configuration du serveur FTP ProFTPD.
/opt/lampp/phpmyadmin/config.inc.php
Fichier de configuration de phpMyAdmin.
/opt/lampp/lampp
Utilitaire de contrôle de XAMPP (présenté dans la suite).
Tableau 3. Actions possibles du script /opt/lampp/lampp
Action
Fonction
start
Démarrer XAMPP (Apache, MySQL, ProFTPD et éventuellement d’autres produits).
startapache
Démarrer uniquement Apache (avec PHP et le support SSL, sauf si ce dernier a été explicitement stoppé auparavant avec la commande stopssl).
startssl
Démarrer uniquement le support SSL (et PHP) ; si le serveur Apache est lancé, il est redémarré avec le support
SSL.
startmysql
Démarrer uniquement MySQL.
startftp
Démarrer uniquement ProFTPD.
stop
Arrêter XAMPP (Apache, MySQL, ProFTPD et éventuellement d’autres produits)
stopapache
Arrêter uniquement Apache
stopssl
Arrêter uniquement le support SSL ; si le serveur Apache est lancé, il est redémarré sans le support SSL
(mais avec PHP).
stopmysql
Arrêter uniquement MySQL.
stopftp
Arrêter uniquement ProFTPD.
reload
Recharger XAMPP (Apache, MySQL, ProFTPD et éventuellement d’autres produits)
reloadapache
Recharger uniquement Apache.
reloadmysql
Recharger uniquement MySQL.
reloadftp
Recharger uniquement ProFTPD.
restart
Redémarrer XAMPP (équivalent de stop puis start).
restartapache
Redémarrer uniquement Apache (équivalent de stopapache puis startapache).
security
Vérifier et configurer la sécurité de XAMPP (abordé ultérieurement).
php5
Activer PHP5 (actuellement sans intérêt puisque PHP 5 est activé par défaut et que c’est la seule version
disponible).
phpstatus
Afficher la version de PHP qui est active.
backup
Sauvegarder XAMPP (abordé ultérieurement).
panel
Démarrer le panneau de contrôle graphique de XAMPP (voir ci-dessous).
status
Afficher le statut de XAMPP (Apache, MySQL et ProFTPD).
version
Afficher la version de XAMPP.
phpsolmag.org/fr
23
Dossier
Tableau 4. Structure de la table livres
Nom
Type
Null
Index
AUTO_INCREMENT
id
INT
Non
PRIMARY
Oui
isbn
VARCHAR(20)
Oui
titre
VARCHAR(100)
Non
petits programmes de démonstration ou d’accéder aux
outils. Le lien Statut affiche une page qui permet de voir
ce qui est démarré ou pas (Figure 6).
Le lien Sécurité affiche une page qui permet de vé�
rifier le niveau de sécurité de l’installation de XAM�
PP ; nous y reviendrons ultérieurement. Le Lien Documentation affichage une page contenant elle-même
plusieurs liens vers les documentations officielles
des principaux produits (notamment Apache, PHP et
MySQL ) et vers quelques tutoriels sur PHP, HTML et
Perl. Le Lien Composants affiche une page donnant
la liste de tous les logiciels inclus dans la distribution,
avec pour chacun d’entre eux un lien vers leur site offi�
ciel respectif.
tite base de données utilisée dans notre application
de test.
Les applications de démonstration et les outils
Le panneau de contrôle graphique de XAMPP per�
met d’arrêter ou de démarrer XAMMP ou l’un des trois
composants principaux (Apache, MySQL, ProFTPD) ; il a l’allure présentée dans la Figure 9. Ce panneau de
contrôle nécessite un environnement graphique opé�
rationnel (X Window, GTK) ainsi que Python (avec les
modules PyGTK et ctypes).
Si le lancement du panneau avec la commande /
opt/lampp/lampp ne fonctionne pas (erreur du style
undefined symbol: FT_GlyphSlot_Embolden), vous pou�
vez essayer de la lancer directement avec la commande
XAMPP présente six applications de démonstration.
Les fichiers source de ces exemples sont stockés
dans le répertoire /opt/lampp/htdocs/xampp. Le lien
phpinfo() affiche le résultat de l’appel à la fonction PHP
phpinfo() et permet donc de voir très précisément la
configuration de PHP, et notamment les extensions
disponibles.
XAMPP propose aussi deux outils bien pratiques,
phpMyAdmin, la célèbre application Web de gestion
des bases de données MySQL, ainsi que Webalizer,
la non moins célèbre application d’analyse du trafic
d’un site Web. Dans la suite de cet article, nous ver�
rons comment utiliser phpMyAdmin pour créer la pe�
Emplacement des fichiers
Tout ce qui est fourni avec XAMPP se trouve dans le
répertoire d’installation (/opt/lampp en ce qui concerne
cet article) ; vous y trouverez notamment les principaux
répertoires et fichiers présentés dans le Tableau 2.
Contrôler XAMPP
Le script /opt/lampp/lampp permet de contrôler tr�������
�����
s pré�
cisément XAMPP. Son utilisation est très simple :
/opt/lampp/lampp <action>
Figure 10. Création de la base de données
Figure 9. Panneau de contrôle graphique de XAMPP
24
Figure 11. Création de la table
5/2011
XAMPP
/opt/lampp/share/xampp-control-panel/xamppcontrol-panel.
Pour les amateurs, j’ai posté un mes�
sage avec une autre solution de contournement sur le
site du support Apache Friends (http://www.apachefriends.org/f/viewtopic.php?f=17&t=44645 ). Démarrer
automatiquement XAMPP au démarrage du système
dépend de la distribution Linux. Sur une distribution de
type Red Hat ou Mandriva, vous pouvez procéder de
la manière suivante dans une session root (testé avec
succès sur une distribution Centos).
Créez un lien symbolique vers /opt/lampp/lampp dans
/etc/init.d :
ln -s /opt/lampp/lampp /etc/init.d/lampp
Ajouter le service lampp dans la configuration de dé�
marrage :
chkconfig --add lampp
Pour information, le script /opt/lampp/lampp est confi�
guré pour démarrer XAMPP dans les niveaux de dé�
marrage 3, 4 et 5.
Développer une petite application
Maintenant que XAMPP est installé et démarré, nous al�
lons pouvoir tester l’écriture et le déploiement d’une petite
(toute petite !) application. Pour changer de la sempiter�
nelle démonstration Hello World, nous allons développer
Listing 1. Le script pub.inc.php
<?php
// Préparation de valeurs pour l’affichage.
Figure 12. Définition des colonnes de la table
function versPage($valeur) {
return is_array($valeur) ?
array_map(‘versPage’,$valeur) :
nl2br(htmlentities($valeur,ENT_
QUOTES,’UTF-8’));
}
// Connexion a la base de données.
Figure 13. Saisie d’un premier livre
function dbConnect() {
$source = ‘mysql:host=localhost;dbname=pub’;
$utilisateur = ‘root’;
$motDePasse = ‘’;
$db = new PDO($source, $utilisateur, $motDePasse);
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_
}
return $db;
EXCEPTION);
// Exécution d’une requete.
function dbExecute($db,$sql) {
$requete = $db->prepare($sql);
$arguments = func_get_args();
array_shift($arguments);
Figure 14. Affichage initiale de la page
array_shift($arguments);
for ($i = 0; $i < count($arguments); $i++) {
}
$requete->bindParam(‘:p’ . $i,$arguments[$i]);
$requete->execute();
}
return $requete;
// Lecture (fetch) du résultat d’une requete.
function dbFetch($requete) {
}
Figure 15. Saisie d’un nouveau livre
phpsolmag.org/fr
return $requete->fetch();
?>
25
Dossier
une petit application qui affiche une liste de livres et per�
met d’en ajouter et d’en supprimer. La liste des livres est
stockée dans une table d’une base de données MySQL.
Listing 2. Le script livres.php
Pour commencer, nous allons donc utiliser phpMyAd�
min pour créer notre base de données et notre table.
Sur la page d’accueil de XAMPP, cliquez sur le lien php<table border=”1” cellpadding=”4” cellspacing=”0”>
<tr align=”center”>
<?php
@include_once(‘pub.inc.php’);
$message = null;
try {
// Se connecter a la base de données.
<th>Identifiant</th><th>ISBN</th><th>Titre</
th><th>Action</th>
</tr>
<?php
$supprimer = ‘<a onclick=”return confirm(\’Est-ce
$db = dbConnect();
bien raisonnable ?\’);” ‘ .
// Déterminer si une action particuliere est requise,
‘href=”livres.php?action=supprimer&a
et si oui,
mp;id=%s”>supprimer</a>’;
// faire le nécessaire.
while ($ligne = versPage(dbFetch($requete))) {
// Ce serait une bonne idée de vérifier la validité
printf
des données en entrée ...
(
switch (@$_GET[‘action’]) {
‘<tr><td>%s</td><td>%s</td><td>%s</
case ‘ajouter’:
td><td>%s</td></tr>’,
$sql = ‘INSERT INTO livres(isbn,titre)
$ligne[‘id’],$ligne[‘isbn’],$ligne[‘titre’],s
dbExecute($db,$sql,$_POST[‘isbn’],$_
);
VALUES(:p0,:p1)’;
POST[‘titre’]);
break;
case ‘supprimer’:
$sql = ‘DELETE FROM livres WHERE id = :p0’;
dbExecute($db,$sql,$_GET[‘id’]);
break;
}
// Exécuter la requete de sélection de tous les
livres.
$sql = ‘SELECT id,isbn,titre FROM livres’;
$requete = dbExecute($db,$sql);
} catch (PDOException $e) {
// En cas d’erreur, préparer un message.
// Peut mieux faire : le message n’est pas très
convivial pour l’utilisateur ...
}
$message = sprintf(‘Erreur (%s).’,$e->getMessage());
?>
<?php echo ‘<?xml version=”1.0” encoding=”UTF8”?>’,”\n”; ?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//
EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Livres</title>
<link href=”pub.css” rel=”stylesheet” type=”text/
</head>
css” />
?>
}
printf($supprimer,$ligne[‘id’])
</table>
<p />
<!-- Formulaire d’ajout -->
<form action=”livres.php?action=ajouter”
method=”post”>
<div>
<table border=”0” cellpadding=”0”
cellspacing=”2”>
<tr><td>ISBN&nbsp;</td>
<td><input type=”text” name=”isbn” size=”20”
maxlength=”20” /></td></tr>
<tr><td>Titre&nbsp;</td>
<td><input type=”text” name=”titre” size=”75”
maxlength=”75” /></td></tr>
<tr><td></td><td><input type=”submit” name=”ok”
</table>
value=”Ajouter” /></td></tr>
</div>
</form>
<?php else: ?>
<!-- Message d’erreur éventuel -->
<div class=”red”><?php echo versPage($message);
<?php endif; ?>
?></div>
</body>
</html>
<body>
<?php if (empty($message)): ?>
<!-- Liste des livres -->
26
5/2011
XAMPP
MyAdmin. Sur la page d’accueil de phpMyAdmin, sai�
sissez le nom de la nouvelle base de donnée (pub) puis
cliquez sur le bouton Créer (Figure 10).
Une fois que le base de données est créée, vous ac�
cédez à la page d’administration de cette nouvelle base
de données. Dans cette page, définissez une nouvelle
table nommée livres et comportant trois colonnes puis
cliquez sur le bouton Exécuter (Figure 11).
Ensuite, définissez les trois colonnes de la table livres
présentées dans le Tableau 4 (Figure 12). Saisissez les
références de ce livre (recommandé par l’auteur ;-)),
puis cliquez sur le bouton Exécuter (Figure 13). C’est
fini pour la base de données. Nous allons maintenant
passer à la partie PHP. Commençons par créer un script
pub.inc.php contenant quelques définitions de fonctions
utiles (voir Listing 1).
Comme vous pouvez le constater, nous utilisons PDO
pour accéder �������������������������������������
�����������������������������������
la base de données. Passons mainte�
nant au script livres.php qui va se charger de toute la
gestion de notre page (voir Listing 2). La premi��������
������
re par�
tie du script contient principalement du code PHP et se
charge de gérer la logique applicative (plutôt simpliste
!). La deuxième partie du script contient principalement
du code HTML et se charge de l’affichage de la page.
Pour terminer, nous allons définir la petite feuille de
style pub.css utilisée dans la page (voir Listing 3).
Notre application est prête ; il ne nous reste plus qu’à
la déployer sur le serveur afin de la tester. Pour cela,
nous allons créer un répertoire pub dans /opt/lampp/
htdocs et y copier nos trois fichiers pub.inc.php, pub.css
et livres.php. Ouvrons maintenant notre navigateur pré�
féré et saisissons l’URL de notre page (http://localhost/
pub/livres.php ou http://localhost/pub/livres.php) . Vous
devriez obtenir le résultat montré dans la Figure 14.
Pour tester l’ajout d’un nouveau livre, vous pouvez saisir
les informations suivantes puis cliquer sur le bouton Ajouter
(Figure 15). Vous devriez alors obtenir le résultat présenté
dans la Figure 16. Je vous laisse tester la suppression.
Sécurisation
Par défaut, l’installation de XAMPP n’est pas du tout sé�
curisée. Si cela peut ne pas poser de problème pour un
Figure 16. Résultat de la saisie d’un nouveau livre
Listing 3. La feuille de style pub.css
body {
font-family: verdana,helvetica;
color: #000000;
background-color: #ffffff;
}
font-size: 12px;
td {
font-family: verdana,helvetica;
Figure 17. Le statut initial de sécurité de XAMPP
color: #000000;
}
font-size: 12px;
a {
font-family: verdana,helvetica;
}
font-size: 12px;
.red {
font-family: verdana,helvetica;
color: #df0000;
font-weight: bold;
}
font-size: 12px;
phpsolmag.org/fr
Figure 18. Sécurisation de XAMPP
27
Dossier
Figure 19. Authentification pour accéder aux pages de XAMPP
Figure 20. Le statut de sécurité de XAMPP après correction
environnement de développement, il n’en est évidem�
ment pas de m������������������������������������
����������������������������������
me pour un environnement de produc�
tion. Le statut de sécurité de XAMPP peut être vérifié
en cliquant sur le lien Sécurité de la page d’accueil (voir
Figure 17).
Comme le montre cette page, il existe plusieurs pro�
blèmes de sécurité :
• L’administrateur de MySQL (root) n’a pas de mot de
passe.
• ���������������������������������������������������
Le mot de passe par défaut de l’utilisateur FTP no�
body est inchangé.
• Les pages de XAMPP (statut, exemples, outils) ne
sont pas protégées et tout le monde peut y accé�
der.
• L’utilisateur pma de phpMyAdmin n’a pas de mot de
passe.
/opt/lampp/lampp security
Pour corriger ces problèmes de sécurité, vous pouvez
utiliser la commande suivante en tant que root :
Cette commande exécute un petit utilitaire interactif
qui vérifie le niveau de sécurité de l’installation et vous
permet de résoudre les probl�������������������������
�����������������������
mes signalés en définis�
sant des mots de passe (voir Figure 18).
Une fois l’opération terminée, vous devrez saisir le
nom d’utilisateur lampp et le mot de passe que vous avez
défini pour accéder aux pages de XAMPP : http://localhost/xampp/ ou http://serveur/xampp/ (voir Figure 19).
Dans la page relative ���������������������������������
�������������������������������
la sécurité, vous devriez main�
tenant obtenir les statuts présentés dans la Figure 20.
De même, pour accéder à phpMyAdmin (http://localhost/
phpmyadmin/ ou http://serveur/phpmyadmin/), il vous
faudra dorénavant saisir un nom d’utilisateur (root par
exemple) et le mot de passe associé (voir Figure 21).
Par ailleurs, si le mot de passe de l’utilisateur root
de MySQL a été défini, l’exemple Collection de CD ne
fonctionne plus. Pour résoudre le probl�����������������
���������������
me, il faut édi�
ter le fichier /opt/lampp/htdocs/xampp/cds.php et ajou�
ter le mot de passe dans les appels à mysql_connect.
Sauvegarde
Figure 21. Authentification pour phpMyAdmin
28
L’utilitaire de contrôle de XAMPP permet de sauvegar�
der tr�����������������������������������������������
���������������������������������������������
s facilement votre environnement (base de don�
5/2011
XAMPP
Figure 22. Sauvegarde
Figure 23. Restauration d’une sauvegarde
nées, fichiers de configuration, fichiers htdocs). Pour
cela, il suffit de saisir la commande suivante en tant que
root : /opt/lampp/lampp backup
Si un mot de passe a été défini pour l’utilisateur root
de MySQL, vous devez l’ajouter à la fin de la ligne de
commande. Malheureusement, dans la version 1.7.4, il
y a un bug qui empêche la commande de fonctionner
correctement et vous obtenez une erreur performance_
schema: FAILED. Ce probl����������������������������
��������������������������
me peut �������������������
�����������������
tre résolu en édi�
tant le script /opt/lampp/share/lampp/backup et en ajou�
tant la condition -o ‟$i” = ‟performance_schema” au
test de la ligne 39 :
# if test ‟$i” = ‟Database” -o ‟$i” = ‟information_
schema”
if test ‟$i” = ‟Database” -o ‟$i” = ‟information_schema”
-o ‟$i” = ‟performance_schema”
Une fois cette correction effectuée, la sauvegarde
fonctionne sans problème (Figure 22). La sauvegarde
se matérialise par un script shell (original !) xamppbackup-dd-mm-yy.sh stocké dans le répertoire /opt/
lampp/backup/ ; ce fichier doit lui m����
�������������
me �����������
���������
tre sauve�
gardé en lieu sûr !
En cas de besoin, il est possible de restaurer une sau�
vegarde, sur la m���������������������������������
�������������������������������
me machine, ou sur une autre ma�
chine, du moment que la version de XAMPP est exac�
tement la même. Pour cela, en tant que root, il suffit
d’exécuter le script qui correspond à la sauvegarde, par
exemple sh xampp-backup-18-02-11.sh. Là encore, si
phpsolmag.org/fr
un mot de passe a été défini pour l’utilisateur root de
MySQL, vous devez l’ajouter ����������������������������
��������������������������
la fin de la ligne de com�
mande.
Comme vous le voyez, vous pouvez avoir besoin de
redémarrer XAMPP. Petite précision trouvée sur le site
Apache Friends, je cite : Tout devrait marcher parfaitement. Mais toujours penser que cette fonction est encore en développement et qu’elle n’est disponible qu’en
version Bêta. A bon entendeur, salut !
Conclusion
A travers cet article vous avez pu constater que
XAMPP est un produit tr��������������������������������
������������������������������
s facile ��������������������
����������������������
installer et �����
�������
admi�
nistrer, mais nous n’avons fait qu’entre-apercevoir toute
sa richesse fonctionnelle. N’hésitez donc pas �����������
���������
l’instal�
ler pour voir tout ce qu’il propose.
OLIVIER HEURTEL
Après plus de huit ans passés en société de service, où il a successivement occupé les postes de développeur, chef de projet puis directeur
de projet, l’auteur a démarré une activité de consultant/formateur
indépendant spécialisé sur les bases de données (Oracle, MySQL) et
le développement Web (PHP). Il est certifié Oracle Certified Professional et a rédigé plusieurs livres sur PHP et Oracle publiés aux Éditions
ENI.
29
Pratique
SQL : les vues
Savoir manipuler les vues permet de limiter l’accès à
un sous-ensemble de données pour une catégorie
d’utilisateurs, de simplifier l’interrogation de la base et d’être
indépendant du schéma relationnel en cas de modification
de ce dernier.
Cet article explique :
Ce qu’il faut savoir :
• L’intérêt des vues.
• Comment les créer et les utiliser.
• Bases de SQL : manipuler et interroger les données.
I
l peut s’avérer utile de ne montrer qu’un sous-ensemble
de données à un utilisateur ou à un groupe d’utilisateurs.
Cela permet de personnaliser l’apparence de la base
en fonction de l’utilisateur : parce qu’il a des privilèges restreints, ou pour réduire la complexité d’utilisation. Ces opérations sont possibles grâce à la création de vues.
Une vue est une table dérivée dynamiquement d’une
ou plusieurs tables, ou d’autres vues. Pour un utilisateur,
la vue est une table comme les autres, elle comporte un
ensemble de colonnes et de lignes. Toute modification
de données dans une des tables utilisées par la vue est
immédiatement répercutée dans la vue. La vue peut être
consultée comme une table de la base, et sous certaines
conditions, ses données peuvent être modifiées avec les
commandes INSERT, DELETE et UPDATE.
Outre le fait que les vues permettent d’améliorer la
sécurité en cachant des parties de la base à un utilisateur donné, elles simplifient le développement et la
maintenance d’applications.
Lorsque des traitements nécessitent l’interrogation de
plusieurs tables, avec des jointures complexes, il peut
être utile de fournir une vue qui sera utilisée par le développeur d’application. Celle-ci lui évitera l’écriture de
jointures, en transformant une requête complexe sur
plusieurs tables en une requête visant une unique table.
En cas de réorganisation du schéma relationnel (ajout
de colonnes dans des tables, tables scindées, ...), la
création de vues permet de ne pas avoir à modifier les
requêtes de l’application. Par exemple, si une table Y
30
est partagée en plusieurs tables, il suffit d’écrire une
vue Y dont la structure est celle de l’ancienne table,
pour que l’utilisateur puisse la manipuler comme avant.
Cet article présente les commandes SQL de création,
de suppression et d’interrogation d’une vue, ainsi que
les conditions qu’une vue doit respecter pour que la
mise à jour de ses données soit autorisée. La dernière
partie explique les techniques utilisées par les SGBD
pour gérer les vues.
Afin d’exécuter les exemples, il est nécessaire que
vous utilisiez l’environnement de travail présenté dans
les articles précédents. Les requêtes proposées dans
cet article sont appliquées à la base biblio présentée
dans les numéros précédents.
Créer une vue
Cette partie présente la commande SQL de création de
vue et ses options, et explique comment créer différents
types de vues.
Commande SQL
La vue est créée par la commande SQL CREATE VIEW à
partir d’une requête SELECT qui définit les données qui
seront visibles :
CREATE VIEW nom_vue
[(nom_colonne1 [, nom_colonne2, ...
])]
AS requete_select
5/2011
SQL : les vues
[WITH [CASCADED|LOCAL] CHECK
OPTION];
La clause optionnelle WITH CHECK OPTION définit le comportement en cas de mise à jour des données d’une
vue. Elle sera décrite dans la partie intitulée Mettre à
jour une vue.
L’instruction ci-après crée une vue date_livre qui
contient les titres et les dates de parution de tous les
livres stockés dans la table livre :
CREATE VIEW date_livre
AS SELECT titre, date_parution FROM
livre;
Le nom donné à la vue doit être unique dans la base,
utiliser un nom de table ou d’une autre vue provoquera
un échec lors de la création.
Nommer les colonnes
Par défaut, les colonnes de la vue prennent le nom
des colonnes de la requête SELECT. La vue date_livre
comporte donc deux colonnes intitulées titre et date_
parution. Il est possible de définir le nom de chaque
colonne de la vue. Pour ce faire, il faut placer la liste des
noms de colonnes entre parenthèses, après le nom donné à la vue. Cette liste doit comporter le même nombre
de colonnes que le résultat de la requête SELECT. S’il y
a une ambiguïté dans les noms de colonnes retournées
par la requête, il faut indiquer la liste des colonnes.
Pour créer une vue date_livre comportant deux colonnes intitulées titre et date, il faut utiliser l’instruction :
CREATE VIEW date_livre
(titre, date)
AS SELECT titre, date_parution FROM
livre;
Créer une vue horizontale
La vue horizontale sélectionne des lignes d’une ou
plusieurs tables. Un utilisateur qui a accès à la vue, ne
verra donc qu’un sous-ensemble de lignes des tables
d’origine. Ces vues utilisent une requête SELECT * avec
une clause WHERE définissant la restriction. Ce type de
vue permet de ne montrer que les lignes nécessaires
à un groupe d’utilisateur. Par exemple, il est possible
de scinder la table livre en plusieurs vues pour ne montrer aux vendeurs que les livres qui concernent leurs
rayons. L’instruction ci-après crée une vue livre_
policier comportant toutes les informations nécessaires au vendeur du rayon policier :
CREATE VIEW livre_policier AS
SELECT * FROM livre WHERE genre =
‘policier’;
phpsolmag.org/fr
Créer une vue verticale
La vue verticale sélectionne un sous-ensemble de colonnes d’une ou plusieurs tables. La requête SELECT comporte donc une liste de colonnes et éventuellement une
restriction. Il est ainsi possible de fournir les données
nécessaires à un groupe d’utilisateurs, tout en excluant
celles superflues ou qui ne doivent pas être divulguées à
ce groupe. Par exemple, un vendeur d’une librairie verra
le prix, le titre et l’ISBN d’un livre, tandis qu’un magasinier
verra l’ISBN, la zone de stockage et la quantité en stock.
L’instruction ci-après crée une vue magasinier qui
donne accès uniquement aux informations utiles à un
magasinier pour tous les livres de la base :
CREATE VIEW magasiner AS
SELECT isbn, quantite, code_zone
FROM livre;
Créer une vue de jointure
Les vues verticales et horizontales sont destinées à afficher
les données nécessaires à un groupe d’utilisateurs. C’està-dire que les données qui ne les concernent pas ne leur
seront pas accessibles. La vue de jointure, quant à elle, est
utilisée pour simplifier l’accès à des données stockées dans
plusieurs tables. Si une vue de jointure est créée, un développeur d’applications pourra interroger cette vue plutôt que
de devoir écrire des jointures complexes.
L’exemple ci-dessous crée la vue info_livre qui comporte quatre colonnes : le titre du livre, sa date de parution, le nom et le prénom de l’auteur. Pour extraire ce
résultat, il faut joindre les tables livre, ecrit et auteur :
CREATE VIEW info_livre AS
SELECT L.titre, L.date_parution,
A.nom, A.prenom FROM livre L
NATURAL JOIN ecrit NATURAL JOIN
auteur A;
Une fois cette vue créée, un utilisateur obtiendra le
titre et le nom des auteurs avec une requête simple,
sans jointure :
SELECT titre, nom FROM info_livre;
Créer une vue de groupe
La vue de groupe, comme celle de jointure, simplifie l’écriture ultérieure de requêtes. Elle consiste à stocker le résultat d’une ou plusieurs opérations de groupe (GROUP BY).
Créer une vue de vue
La syntaxe de création de vue reste identique si l’on
souhaite créer une vue à partir d’une table ou à partir
d’une vue déjà existante. Pour créer une seconde vue
titre_nom contenant deux colonnes (le titre du livre et le
nom de l’auteur) à partir de la vue info_livre :
31
Pratique
CREATE VIEW titre_nom AS
SELECT titre, nom FROM
info_livre;
Interroger une vue
Une fois créée, il est possible d’interroger une vue de
la même manière qu’une table normale, avec la commande SELECT. La requête suivante affiche tous les
titres des livres présents dans la vue info_livre :
SELECT titre FROM info_livre;
Les modifications dans la structure d’une table utilisée
par une vue, ne sont pas répercutées dans la vue. En
cas d’ajout d’une colonne dans la table sous-jacente,
une vue horizontale créée avec un SELECT * n’affichera
pas les données de cette nouvelle colonne. De plus, la
suppression d’une colonne utilisée dans une vue verticale provoquera une erreur. Par exemple, si la colonne
quantite est supprimée de la table livre, la vue verticale magasinier ne fonctionnera plus. L’interrogation
de la vue produira l’erreur :
View magasinier references invalid table(s) or column(s).
Il faut donc penser à modifier les vues pour qu’elles
prennent en compte les changements de structure de
leurs tables sous-jacentes. Pour ce faire, il faut supprimer la vue et la recréer.
Mettre à jour les données d’une vue
Les vues sont généralement utilisées pour extraire des
informations de la base, mais il est possible, sous certaines conditions, de modifier les données à travers la
vue. Si le SGBD est capable de retrouver la ligne dans
la table d’origine et d’identifier les colonnes et les valeurs à leur affecter, alors la vue acceptera les modifications de données.
Vérifier si la mise à jour est possible
Lors de la création d’une vue, MySQL indique dans le
dictionnaire des données si celle-ci peut être mise à
jour. L’information est stockée dans la table VIEWS du
dictionnaire (base information_schema). Cette table
comporte les informations sur les vues créées (nom de
la vue, requête de création, mise à jour possible, ...).
Si le champ IS_UPDATABLE contient la valeur NO, les requêtes INSERT, DELETE et UPDATE seront rejetées. La valeur de ce champ peut-être obtenue avec la requête :
SELECT * FROM information_schema.VIEWS;
Conditions de mise à jour
Pour permettre la modification de données (insertion,
suppression, mise à jour), une vue doit respecter les
conditions suivantes :
32
• les doublons ne sont pas éliminés (ne pas utiliser
DISTINCT),
• la requête n’utilise pas de fonction d’agrégation
(SUM, COUNT, MAX, MIN, AVG),
• la requête ne fait pas d’opération sur les groupes
(pas de GROUP BY ni de HAVING),
• un même nom de colonne n’apparaît pas deux fois,
• il n’y a pas de colonne dérivée (pour un UPDATE il
suffit qu’il ne porte pas sur une colonne dérivée),
• dans le cas d’une suppression : pas de jointure,
• dans le cas d’une insertion ou d’une mise à jour :
la vue porte sur une table ou sur une jointure interne (pas de jointure externe) et la requête de
modification ne porte que sur une table sousjacente,
• le SGBD est capable de retrouver la ligne dans la
table source et les colonnes,
• il n’y a pas de sous-requête corrélée dans le WHERE,
• dans le cas d’une insertion : toutes les colonnes qui
n’ont pas de valeur par défaut et qui sont NOT NULL
doivent être renseignées,
• la création de vue n’utilise pas ALGORITHM =
TEMPTABLE (uniquement avec MySQL, cf Résolution
versus matérialisation).
Par exemple, dans une vue info _ livre _ policier
constituée de trois colonnes (isbn, titre et date_parution), il est possible d’insérer un nouveau livre :
CREATE VIEW info_livre_policier AS
SELECT isbn, titre, date_parution
FROM livre
WHERE genre = ‘policier’;
INSERT INTO info_livre_policier VALUES (‘125-9-124981’,’Le Sauveur’,2005);
L’insertion est autorisée et répercutée sur la table
livre. Si le champ genre est défini comme NOT NULL
dans la table livre et que la valeur par défaut est
fixée au genre policier, alors ce livre prendra la valeur
‘policier’ lors de l’insertion.
La modification du prénom d’un auteur dans la vue de
jointure info_livre est acceptée par MySQL car cette
modification ne porte que sur une table sous-jacente à
la vue. La requête suivante modifie le prénom de l’auteur Baudelaire, la modification est réalisée automatiquement dans la table auteur :
UPDATE info_livre SET prenom=’C.’ WHERE
nom=’Baudelaire’;
Par contre, la modification suivante est refusée :
UPDATE info_livre SET titre = ‘Les Fleurs du Mal’,
prenom = ‘C.’
5/2011
SQL : les vues
WHERE titre = ‘fleurs du mal’ AND nom
= ‘Baudelaire’;
MySQL affiche un message indiquant que la modification porte sur plus d’une table de la vue de jointure
(table livre pour le titre et auteur pour le prénom) :
Can not modify more than one base table
through a join view info_livre.
Interdire la migration de données
Les lignes d’une vue font partie de la vue parce qu’elles
satisfont la condition WHERE de la requête de définition.
Lors d’une mise à jour de données dans la vue, une
ligne modifiée peut ne plus satisfaire la condition, dans
ce cas elle disparaît de la vue.
Par exemple, changer le genre d’un livre d’une ligne
de la vue horizontale livre_policier provoquerait la
migration de la ligne en dehors de la vue (cette vue
n’affiche que les livres dont le genre est policier). Si on
insère un nouveau livre dans la vue en lui mettant un
genre poésie, la ligne insérée est immédiatement supprimée de la vue car elle ne respecte pas le WHERE de la
requête de définition.
La clause WITH [LOCAL|CASCADED] CHECK OPTION, disponible depuis MySQL 5.0.2 dans la commande de
création de la vue, interdit toute modification de ligne
de la vue ou toute insertion, si elle provoque une migration de données. C’est-à-dire que l’opération est interdite si la ligne modifiée ou insérée au travers de la vue,
ne peut pas être visualisée par la vue. La ligne ne sera
modifiée ou insérée dans une table sous-jacente que si
elle satisfait la condition du WHERE. Cette clause ne peut
être utilisée que dans une vue qui accepte les mises à
jour.
Les mots clés CASCADED et LOCAL indiquent la portée
de la vérification dans le cas de hiérarchies de vues,
c’est-à-dire de vues définies à partir d’autres vues. Le
mot-clé LOCAL indique que la vérification s’applique uniquement à la vue courante. Le mot-clé CASCADED indique
que la vérification s’applique à la hiérarchie de vue (valeur par défaut).
Par exemple, la vue vue_livre retient tous les livres
publiés avant 1900 :
CREATE VIEW vue_livre AS
SELECT * FROM livre WHERE date_
parution < 1900 WITH CHECK OPTION;
Les vues vue _ livre2 et
rapport à vue _ livre :
vue _ livre3
sont définies par
CREATE VIEW vue_livre2 AS
SELECT * FROM vue_livre WHERE date_
parution > 1600 WITH LOCAL CHECK
phpsolmag.org/fr
OPTION;
CREATE VIEW vue_livre3 AS
SELECT * FROM vue_livre WHERE date_
parution > 1600
WITH CASCADED CHECK OPTION;
Pour la deuxième vue, l’insertion ne sera testée que
sur la vue courante grâce à l’utilisation du mot-clé
LOCAL. Il est possible d’insérer un livre dont l’année est
postérieure à 1900 :
INSERT INTO vue_livre2 (isbn, titre, genre, date_
parution, prix)
VALUES (‘254-16589-5’, ‘L etoile du
diable’, ‘policier’, 2003, 12);
1 row OK
L’insertion est acceptée car l’année de parution étant
supérieure à 1600, la restriction de vue _ livre2 est
vérifiée. La donnée insérée dans la table livre ne sera pas visible dans vue _ livre, vue _ livre2 et vue _
livre3 car la vue vue _ livre exclut les livres parus
après 1900. Par contre, l’insertion dans la troisième
vue est rejetée car elle est testée par rapport aux restrictions des vues de la hiérarchie (échec dans vue _
livre car 2003 > 1900) :
INSERT INTO vue_livre3 (isbn, titre, genre, date_
parution, prix)
VALUES (‘254-16589-6’, ‘L etoile du
diable’, ‘policier’, 2003, 12);
CHECK OPTION failed vue_livre
Supprimer une vue
La commande SQL DROP
la vue :
VIEW
supprime la définition de
DROP VIEW nom_vue [RESTRICT|CASCADE]
Lorsque CASCADE est précisé, les objets qui en dépendent sont supprimés (toute vue qui utiliserait cette
vue serait effacée). La clause RESTRICT bloque la suppression de la vue si des objets en dépendent, c’est
l’option par défaut.
Les vues ont été implémentées dans la version 5
de MySQL. Dans la version actuelle (5.5), RESTRICT et
CASCADE sont ignorés. La suppression d’une vue sera
réalisée même si d’autres vues en dépendent.
La commande suivante supprime la vue info_livre :
DROP VIEW info_livre;
Résolution versus matérialisation
Lorsque le SGBD rencontre une référence à une vue
dans une requête, il utilise la définition de la vue pour
33
Sur Internet
•
http://dev.mysql.com/doc/refman/5.0/fr/views.html
transformer la requête en une requête équivalente sur
les tables sous-jacentes. Cette technique est appelée
résolution de vue. Elle est coûteuse lorsque la requête
de définition utilise des jointures complexes car cellesci doivent être calculées à chaque appel de la vue.
Les SGBD proposent une technique alternative :
la matérialisation de vue. Celle-ci consiste à stocker
la vue comme une table temporaire dans la base de
données. Lorsque la vue est appelée la première fois,
les données sont stockées dans la table temporaire. A
chaque modification d’une des tables sous-jacente, la
table temporaire doit être mise à jour. La matérialisation de vue est donc efficace lorsque de nombreuses
requêtes sont effectuées sur une vue complexe et que
les données d’origine ne sont pas souvent modifiées.
MySQL définit une clause optionnelle ALGORITHM dans
la commande de création de la vue (elle n’existe pas
dans le standard SQL). Celle-ci prend trois valeurs :
MERGE (résolution de vue), TEMPTABLE (matérialisation
dans une table temporaire), ou UNDEFINED (MySQL choisit l’algorithme à utiliser). La valeur par défaut, s’il n’y a
pas de clause, est UNDEFINED. MySQL tend à privilégier
la résolution de vues plutôt que la matérialisation car
dans MySQL la vue ne peut pas être mise à jour quand
elle utilise une table temporaire. MySQL utilise toujours
des tables temporaires lorsque la définition de la vue
contient des fonctions d’agrégation, DISTINCT, GROUP BY,
HAVING, LIMIT ou UNION.
Conclusion
Dans cet article, vous avez appris à créer et à utiliser
des vues. Celles-ci vous permettront d’améliorer la sécurité, de réduire la complexité d’accès aux données,
et de rendre les applications indépendantes du schéma
relationnel.
CILIA MAURO, MAGALI CONTENSIN
Cilia Mauro est gestionnaire de bases de données et développeur
d’applications web au CNRS. Elle enseigne les bases de données et
PHP à l’université.
Contact : [email protected]
Magali Contensin est chef de projet en développement d’applications au CNRS. Elle enseigne depuis plus de dix ans le développement d’applications web à l’université et est l’auteur de nombreux
articles sur le développement web en PHP.
Contact : http://magali.contensin.online.fr
34
eZ Publish
Créer son site internet
avec le CMS eZ Publish
Créer un site internet, qu’il soit à titre personnel ou professionnel, peut
passer par le choix d’un CMS (Content Management System ou Système
de Gestion de Contenu) plutôt qu’un Framework. Que ce soit un blog
sur un musicien qu’on apprécie, un portail institutionnel ou un site
de vente de t-shirts en ligne, il est nécessaire de connaître les forces
et faiblesses des CMS pour voir un jour son site internet en ligne sans
problème. Dans ce cas, choisir EZ Publish peut être un choix judicieux.
Cet article explique :
Ce qu’il faut savoir :
• Après lecture de cet article, vous aurez une vision théorique et
pratique des points importants à assimiler pour vous lancer dans
l’installation et la programmation sur eZ Publish. Des exemples
concrets viendront corroborer les concepts de ce CMS.
• Pour comprendre cet article, il est souhaitable de posséder
des connaissances basiques sur Linux, Apache, MySQL, ainsi
que de solides compétences en programmation PHP5.
P
our la petite histoire, eZ Publish est un CMS
(Système de Gestion) édité par la société norvégienne eZ Systems. La dernière version stable
publiée est eZ Publish 4.4.X, lancée fin 2010. eZ Publish fonctionne principalement avec le langage de programmation PHP5, une base de données SQL, un serveur Apache et un système d’exploitation Linux (LAMP).
D’autres configurations de serveur sont également possibles, voir les liens utiles.
Pourquoi et quand utiliser eZ Publish ?
Lorsque l’idée de choisir un framework (CakePHP, Symfony, etc...) est écartée parce qu’il est nécessaire de développer un back-office, ou que repartir d’un développement spécifique from scratch nécessite de réinventer
la roue, le choix d’un CMS peut s’imposer facilement.
Côté pratique, le choix d’un CMS se fait sur les fonctionnalités correspondant, ou pas, aux besoins du cahier des charges du projet. Il peut également se baser
sur l’expérience utilisateur du back-office.
Côté technique, le choix d’un CMS se fait sur les arguments spécifiques qu’il propose, c’est-à-dire principalement le langage de programmation sur lequel il est basé,
les extensions ou plugins que la communauté ou la société éditrice propose, toujours nécessairement en rapport aux besoins fonctionnels, sa communauté de développeurs experts, et éventuellement et surtout son coût.
Lorsque les fonctionnalités d’un CMS lambda répondent au plus proche aux besoins fonctionnels et
phpsolmag.org/fr
techniques d’un projet, c’est lambda qu’il faut choisir.
Encore faut-il connaître lambda par rapport à d’autres
CMS.
Sur le marché actuellement, différents CMS issus du
monde du logiciel libre sont proposés au téléchargement. Les principaux logiciels concurrents d’eZ Publish
sont Drupal, Typo3, Joomla, SPIP, voire même Wordpress.
La solution eZ Publish est tout d’abord et surtout puissante par sa flexibilité; De manière générale, un site internet dont le contenu est géré dynamiquement affiche
du contenu de différentes façons, ou vues. Ce contenu
doit donc être structuré, mais également et surtout typé.
Un contenu peut être par exemple un produit (possédant un titre, deux visuels, une description et un prix)
ou également un article (possédant un titre, une introduction, un texte). Dans eZ Publish, la structure décrivant un produit ou un article correspond au concept de
classe de contenu (content class en anglais). De même,
le type d’un attribut d’une classe de contenu, comme un
titre, est un datatype. Dans ce cas, le datatype est une
ligne de texte. eZ Publish fournit par défaut une pléthore de datatypes, ces derniers étant extensibles. Le
titre d’un article Le dernier produit sorti de notre gamme
est donc un attribut de la classe produit.
Le schéma suivant résume ces concepts :
http://doc.ez.no/var/doc/storage/images /ez_ publish/technical_manual/4_0/images/concepts_and_
35
Pratique
basics/datatypes_attributes_content_class_and_
objects/565-8-eng-GB/datatypes_attributes_content_
class_and_objects_doc.png.
Nous pouvons également étendre ces concepts pour
un site multilingue ou multisite sans pour autant ajouter une extension ou un plugin comme le nécessiteraient certains CMS. De même, le système de versionning d’eZ Publish est inclus par défaut dans son
noyau.
Conclusion
eZ Publish est un CMS parmi tant d’autres, il possède
ses forces et ses faiblesses, nombreux sont les comparatifs sur l’internet, encore faut-il avoir eu une réelle
expérience pour en juger.
Liens utiles :
• http://ez.no - Le portail officiel du produit,
• http://ez.no/eZPublish/Requirements - Les besoins
logiciels pour installer eZ Publish,
• http://alpha.benchmarkr.com/benchmarkrs/11 Benchmark fonctionnel précis mais datant un peu
de 4 CMS,
• http://www.cmsmatrix.org - Le comparatif de tous
les CMS existants,
• http://www.journaldunet.com/developpeur/tutoriel/
out/040510-10-cms-open-source.shtml - Un autre
comparatif de certains CMS sur le journal du net,
• http://share.ez.no/forums/general/ezpublish-vs-drupal-vs-joomla-and-typo3 - Discussion des différents CMS sur le forum officiel d’eZ Publish,
• http://phpsolmag.org/fr/magazine/1629-ez-publishguide-de-developpement - Article sur le concept
de datatype sur eZ Publish,
• http://doc.ez.no/eZ-Publish/Technical-manual/4.4/
Concepts-and-basics/Content-management/Mul-
tiple-languages - Le concept de classes de contenu multilingues.
Configuration serveur
Avant de commencer à modifier la configuration serveur, il est nécessaire au préalable d’avoir correctement
installé les éléments logiciels d’un site internet sous
LAMP : Linux (dans notre cas, Ubuntu pour l’environnement local), Apache, MySQL et PHP.
Les chapitres suivants donnent des exemples basés
sur un site internet dont le nom de domaine www.nounours.com, serait un portail proposant un catalogue de
peluches (Les produits) groupées par catégorie, ainsi
que des pages simples contenant du texte (Page de
présentation de la société, mentions légales, etc...).
Linux
Bien sûr, nous n’allons pas détailler et expliquer l’installation d’un système d’exploitation Linux, mais plutôt
la raison pour laquelle nous choisissons cet OS pour
notre machine de développement en local, ainsi que le
serveur de production sur lequel nous allons faire tourner le site.
Choisir le bon environnement de développement évite
bien des désagréments. La question que l’on se pose
est : développer sous un environnement Windows (avec
WAMP par exemple) ou Linux (Ubuntu par exemple) ?
Mis à part la disponibilité des éditeurs de programmation sur chacun de ces OS, le choix est propre au développeur ou au pôle technique (éditeur rapide avec
simple coloration syntaxique ou éditeur tournant sous
JAVA avec auto-complétion). Il ne faut pas oublier, qu’en
plus des bugs et contraintes sur Windows, comme la limitation du nombre de caractères d’un fichier (très vite
atteint sur eZ Publish), la lenteur d’exécution d’eZ Publish avec un système de fichiers NTFS, un environnement de développement doit tout d’abord être proche
Figure 1. L’interface du back-office eZ Publish sur les dernières versions
36
5/2011
Pratique
d’un environnement de production. Sans oublier la base
même des concepts de logiciels libres.
# Exécutons la commande suivante pour prendre en compte
la nouvelle configuration
$ /etc/init.d/apache2 reload
Apache
Avant de nous lancer dans la configuration Apache, il
est nécessaire de créer le répertoire dans lequel nous
allons installer le site dans notre environnement local.
Par exemple :
Bien sûr, n’oublions pas de déclarer les 2 URLs (frontoffice et back-office) définies dans le virtual host, dans
notre fichier hosts :
$ sudo gedit /etc/hosts
/var/www/nounours.
→ fichier hosts.conf
Les commandes suivantes sont à exécuter sur un OS
Ubuntu sur notre environnement local avec l’utilisateur
root (préfixées par le mot-clé sudo) :
# Allons dans le répertoire des virtual hosts en local
En testant les URLs http://nounours.local et http://admin.nounours.local/ dans notre navigateur préféré, et
en ayant au préalable créé un fichier vide index.php,
nous arrivons bien sur une page blanche, ne générant
aucune erreur dans nos fichiers de logs.
$ cd /etc/apache2/sites-available/
MySQL
# Créons notre virtual host avec l’éditeur gedit
$
sudo gedit nounours.conf
→ fichier nounours.conf
# Créons un lien symbolique de fichier de sites-available
vers sites-enabled
$ sudo a2ensite nounours.conf
Nous allons donc créer notre base de données vide
nommée s_nounours à travers l’interface locale de phpMyAdmin, ou pour les puristes, en ligne de commande,
et y associer un utilisateur MySQL ayant tous les droits
sur cette base de données :
# Créons la base de données s_nounours
CREATE DATABASE `s_nounours` DEFAULT CHARACTER SET utf8
COLLATE utf8_unicode_ci ;
# Créons notre utilisateur user_nounours
CREATE USER ‘user_nounours’@’localhost’ IDENTIFIED BY
‘***’;
# Donnons-lui tous les droits sur la base de données
user_nounours
GRANT ALL PRIVILEGES ON * . * TO ‘user_
nounours’@’localhost’ IDENTIFIED BY
‘***’ WITH GRANT OPTION MAX_QUERIES_
PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR
0 MAX_UPDATES_PER_HOUR 0 MAX_USER_
CONNECTIONS 0 ;
# Testons notre utilisateur en ligne de commande
$ sudo mysql -u user_nounours -p s_nounours
PHP
Les dernières versions d’eZ Publish requierent une version
récente de PHP, de préférence PHP 5.2.X ou PHP 5.3.X.
# Cette commande permet de connaître la version de PHP
$ php -v
Figure 2. Le panneau de configuration du mode DEBUG
38
installée
De plus, eZ Publish permet le redimensionnement
d’image, il est donc nécessaire d’installer, si ce n’est
déjà fait, le logiciel libre ImageMagick.
5/2011
eZ Publish
# Cette commande permet de connaître la version
$ convert -version
d’ImageMagick installée
Conclusion
Nombre de configurations logicielles sont possibles,
mais optimiser son environnement de développement
permet de gagner en temps, en confort de programmation, et bien sûr en argent.
• Nous créons les identifiants du compte super administrateur du back-office, que nous gardons bien en
mémoire.
• Nous arrivons donc sur les pages d’accueil du
front-office et du back-office :
Liens utiles :
• http://doc.ez.no/eZ-Publish/Technical-manual/4.4/
Installation/Virtual-host-setup/Virtual-host-example - Documentation officielle sur la configuration du
virtual host,
• http://ez.no/eZPublish/Requirements - Les besoins
logiciels pour installer eZ Publish.
Installation,
installer le CMS
Il existe deux versions de téléchargement du CMS : une
version entreprise et une version communauté. Nous
allons télécharger et installer la version 4.4 – Fuji d’eZ
Publish sous Linux, incluant la librairie PHP eZ Components. Cette dernière a d’ailleurs été soumise à et validée par la communauté Apache, sous le nom de Zeta
Components.
Après avoir donc téléchargé le fichier, décompressé
dans le répertoire /var/www/nounours, puis vérifié que
les répertoires et fichiers possèdent les bons droits,
nous arrivons donc, en lançant dans notre navigateur
favori, l’interface suivante :
→ fichier install_ez_4_4.png
• En cliquant sur le bouton Paramétrage fin, nous
vérifions les éventuels logiciels ou configurations
manquants.
• Nous suivons donc les étapes, jusqu’à celle où
nous saisissons les paramètres de connexion à la
base de données définie plus tôt.
• Nous allons nous contenter d’un site en français
uniquement, en laissant la valeur par défaut.
• Nous arrivons sur l’étape du package (paquetage) :
ce sont des thèmes prédéfinis. Nous choisissons le
package le plus simple : Plain site.
• Nous faisons correspondre la langue anglaise au
français : Map to French.
• Nous arrivons à la page Site details, où nous saisissons donc le Titre (correspondant au title du site,
bien sûr modifiable ensuite), l’URL du site (http://
nounours.local), ce que nous appellerons les siteaccess du front-office (plain _ site) et du backoffice (plain _ site _ admin), et nous sélectionnons
bien sûr la base de données nommée s_nounours..
phpsolmag.org/fr
Figure 3. En mode édition, nous avons accès à diverses informations
du contenu édité
39
Pratique
→ fichier backoffice_accueil.png
→ fichier frontoffice_accueil.png
Conclusion
Installer la base d’eZ Publish est rapide et simple, les
chapitres suivants vont donc demander toute l’attention
du développeur.
Liens utiles :
• http://ez.no/Requests/eZ-Publish-Enterprise-4.4 Tester la version Entreprise,
• http://share.ez.no/download-develop/downloads Télécharger la version Communauté,
• http://ezcomponents.org - La librairie PHP eZ
Components,
• http://incubator.apache.org/zetacomponents
Apache Zeta Components,
• http://ez.no/Demos-videos - Tutoriel et démonstration en vidéo.
Comprendre et configurer
eZ Publish, le contenu
Avant de nous lancer dans le développement pur et dur,
nous allons tout d’abord créer notre contenu en back-
office, plus précisément créer les classes de contenu,
ainsi que l’arborescence du site.
Il est utile également de naviguer dans le back-office
pour y trouver et comprendre les nombreuses fonctionnalités possibles, en cliquant sur les cinq onglets principaux.
Avant ceci, nous allons faire correspondre l’URL http://
admin.nounours.local à http://nounours.local/plain_
site_admin. Dans le fichier RACINE_DU_SITE/settings/
override/site.ini.append.php, nous éditons le bloc
[SiteAccessSettings], en le remplaçant par :
[SiteAccessSettings]
ForceVirtualHost=true
CheckValidity=false
AvailableSiteAccessList[]=plain_site
AvailableSiteAccessList[]=plain_site_admin
MatchOrder=host
HostMatchMapItems[]=nounours.local;plain_site
HostMatchMapItems[]=admin.nounours.local;plain_site_
admin
Nous allons créer nos trois classes de contenu : produit, catégorie et page. En allant dans Administration >
Figure 4. Page d’accueil après l’installation
40
5/2011
eZ Publish
Classes > Content, nous remarquons que l’installation basique d’eZ Publish fournit par défaut des classes à titre
d’exemple, que nous n’allons pas réutiliser. En cliquant sur
le bouton Nouvelle classe, nous arrivons sur l’interface
d’édition d’une classe, sur laquelle nous allons saisir les informations suivantes. Exemple sur la classe produit :
# Ceci est le nom de la classe au format humain
produits) et page. Après avoir créé nos classes de
contenu, nous allons donc créer l’arborescence du
site, en créant les instances de ces classes : les objets.
Voici l’arborescence que nous créons, à partir de
la racine (Nom, puis entre parenthèses, la classe de
contenu).
Nom : produit
→ EZ Publish
Identifiant : product
→ La peluche Mickey Mouse (Produit)
→ La peluche Donald Duck
# Ceci est le nom de la classe au format informatique
# Description de la classe, nous laissons vide
Description : vide
# Ceci va générer le libellé affiché en back-office du
contenu, nous choisissons l’attribut
title créé après
Modèle de nom d’objet : <title>
# Ceci va générer automatiquement l’URL en back-office
et en front-office. Nous choisissons
(Catégorie)
→ La peluche Minnie Mouse
→ Poupées (Folder)
→ Peluches (Catégorie)
→ Mélanie
→ Arthur
(Produit)
(Produit)
(Produit)
(Produit)
→ Mentions légales (Page)
→ La société
(Page)
donc qu’eZ Publish permet de
Chaque nœud de l’arborescence se crée de la manière suivante :
créant par exemple un autre attribut
> Contenu > Sélection de la classe >
l’attribut title, mais remarquons
personnaliser l’URL d’un contenu en
nommé url.
Modèle de génération de l’URL : <title>.
Le Tableau 1 récapitule la structure de la classe produit. Il n’affiche pas les valeurs des propriétés par défaut. Nous obtenons donc (16 est le numéro identifiant
de la classe produit) :
http://admin.nounours.local/class/view/16.
Nous faisons de même pour les classes catégorie (en cochant conteneur, les catégories ayant des
Créer un nouvel
objet > Saisie du contenu de chaque
attribut > Publier
Après la publication d’un objet, notons que ce dernier possède, entre autres, les propriétés suivantes : un contentobject _ id et un node _ id. Le
contentobject _ id est l’entier identifiant unique associé à l’objet, alors que le node _ id est l’identifiant associé à l’objet, sur l’arborescence. Nous en déduisons
donc qu’un objet peut posséder plusieurs node_id, à
différents endroits de l’arborescence, ce qui traduit la
notion de multi-emplacements d’eZ Publish.
Figure 5. Fiche produit d’un objet en front-office
phpsolmag.org/fr
41
Pratique
En mode édition, nous pouvons voir, sur la colonne de
gauche, les différentes informations et fonctionnalités
propres à un objet.
→ colonne_gauche_edition.png
Les fichiers de configuration
Comme tout CMS, eZ Publish possède nombre de
propriétés configurables possibles. Ces variables
sont éditables dans des fichiers de configuration :
les fichiers .ini. Ces fichiers sont situés dans le répertoire RACINE_DU_SITE/settings. Chacun de ces fichiers possède les valeurs par défaut des variables
modifiables via le back-office, ou de préférence en
les éditant manuellement. Plus précisément, ces fichiers ne sont pas à modifier, car faisant partie du
noyau d’eZ Publish, nous créons un nouveau fichier
en les surchargeant. Une surcharge d’une valeur
est un nouveau fichier dans lequel nous écrivons la
nouvelle valeur, qui prend la priorité sur la valeur
par défaut.
Chaque valeur est associée à une variable, faisant
partie d’un bloc. Au même titre que nous avons surchargé le bloc [SiteAccessSettings], nous pouvons également surcharger d’autres variables de bloc.
Exemple
Le fichier des valeurs par défaut de la connexion à la
base de données se trouve dans le fichier RACINE_DU_
SITE/settings/site.ini, dans le bloc DatabaseSettings :
[DatabaseSettings]
Server=localhost
User=root
Password=
Database=nextgen
Lors de l’installation, eZ Publish a automatiquement
créé un nouveau fichier surchargeant ces valeurs,
le fichier qui prend désormais le pas, se trouve dans
RACINE _ DU _ SITE/settings/siteaccess/plain _ site/
site.ini.append.php.
[DatabaseSettings]
Server=localhost
User=user_nounours
Password=YvJq7ou3VVu5
Database=s_nounours
Ceci est donc valable pour le
(siteaccess
du
front-office).
siteaccess plain _ site
Parallèlement, dans le
Figure 6. L’interface d’installation d’eZ Publish
42
5/2011
eZ Publish
répertoire
RACINE _ DU _ SITE/settings/siteaccess/
plain _ site _ admin/,
nous remarquons qu’un même
fichier existe, possédant les mêmes valeurs. Ceci est
donc également valable pour le siteaccess plain _
site _ admin (siteacces du back-office). Nous regroupons donc ces valeurs dans le fichier RACINE _ DU _
SITE/settings/override/site.ini.append.php. Ceci est
donc désormais valable pour les deux siteaccesses du
front-office et du back-office.
De manière générale, ce type de fichier doit être
nommé fichier.ini.append.php pour la surcharge du
fichier fichier.ini. Suivant sa portée, il est placé soit dans
RACINE_DU_SITE/settings/override,
soit dans
soit
DU_SITE/settings/siteaccess/plain_site,
RACINE_
RACINE_
DU_SITE/settings/siteaccess/plain_site_admin.
Dans les chapitres suivants, nous définirons les siteaccesses (front-office et back-office) par le mot-clé
###SITEACCESS###.
Conclusion
La notion de surcharge d’un siteaccess est une fonctionnalité propre à eZ Publish. Elle permet s’associer
une valeur de variable de configuration propre à un siteaccess uniquement, ou de l’étendre à tous les siteac-
Figure 7. Ce que le mode DEBUG ON affiche en front-office
phpsolmag.org/fr
43
Pratique
cesses, ce qui permet une grande flexibilité. Ceci étant
dit, elle requiert de la part du développeur une grande
rigueur dans la gestion des variables. Nous verrons de
même, que le concept de surcharge s’applique également à d’autres répertoires et fichiers.
Liens utiles :
• http://doc.ez.no/eZ-Publish/User-manual/4.x/Dailytasks/Publishing-at-multiple-locations - La notion
de multi-emplacements,
• http://doc.ez.no/eZ-Publish/User-manual/4.x/Theadministration-interface/The-Object-edit-interface
- Édition d’un objet,
• http://doc.ez.no/eZ-Publish/Technical-manual/4.x/
Concepts-and-basics/Configuration - Siteaccess
et configuration.
Développement,
le langage de templates
Un fichier template est un fichier texte dont l’extension
est .tpl. Il définit la vue d’un objet sur le front-office ou le
back-office. Il contient du code HTML ainsi que du code
de templating eZ Publish. Il ne contient en aucun cas
de PHP comme d’autres CMS le permettent. Un objet,
ainsi que ses attributs, peut être donc affiché de différentes façons. Un fichier template se trouve par défaut
dans le répertoire RACINE_DU_SITE/design. De même
que les fichiers de configuration précédemment définis,
ces fichiers ne sont pas à modifier, car faisant partie du
noyau. Ces fichiers sont également à surcharger.
De manière plus générale, à l’exception des fichiers
de configuration se trouvant dans les sous-répertoires
RACINE_DU_SITE/settings/, nous créons nos fichiers
dans des sous-répertoires se trouvant uniquement sous
RACINE_DU_SITE/extension.
Tout comme le typoscript à Typo3 ou les boucles à
SPIP, le langage de templating eZ Publish est uniquement propre au CMS. De la documentation est disponible sur ce lien : → http://doc.ez.no/eZ-Publish/Technical-manual/4.x/Templates.
Surcharge d’un template
Avant de nous lancer dans la programmation d’un template, il nous faut le créer. Nous allons donc créer l’extension de notre projet nounours et l’activer, en supposant que nous travaillons dans la société Tartepempion.
Comme dans tout projet web ou informatique, il est vivement recommandé de suivre des best practices lors
de la création de répertoires.
Nous allons créer l’arborescence des sous-répertoires suivants :
RACINE_DU_SITE
> extension
# Nous préfixons notre extension par la première lettre
44
de notre société
> t_nounours (1)
# Répertoire contenant les templates et autres fichiers
statiques (css, javascript, images,
etc...)
> design (2)
# Répertoire contenant les fichiers définissant l’affichage
du siteaccess du front-office
> nounours_front (3)
# Répertoire contenant les fichiers templates
> templates (4)
Nous copions ensuite le fichier
RACINE _ DU _ SITE/
vers (4).
Ce nouveau fichier template surcharge donc celui définissant l’affichage par défaut, mais surtout il contient
le code contenu dans chaque page affichée en front-office : c’est le template conteneur principal.
Pour le prendre en compte, il est nécessaire de définir dans un fichier de configuration l’existence du répertoire (2). Nous créons le fichier design.ini.append.php
sous RACINE_DU_SITE/extension/t_nounours/settings/.
design/standard/templates/pagelayout.tpl
→ RACINE_DU_SITE/extension/t_nounours/settings/design.
ini.append.php
De même, nous définissons également (3) en créant
le fichier site.ini.append.php sous RACINE _ DU _ SITE/
extension/t _ nounours/settings/siteaccess/plain _
site/.
→ RACINE_DU_SITE/extension/t_nounours/settings/
siteaccess/plain_site/site.ini.
append.php
Nous activons notre nouvelle extension en ajoutant la
ligne suivante au fichier RACINE _ DU _ SITE/settings/
override/site.ini.append.php.
[ExtensionSettings]
ActiveExtensions[]
ActiveExtensions[]=ezjscore
ActiveExtensions[]=ezie
ActiveExtensions[]=ezoe
ActiveExtensions[]=ezodf
# Activation de la nouvelle extension
ActiveExtensions[]=t_nounours
Enfin, nous vérifions que tous les fichiers et répertoires nouvellement créés possèdent les bons droits
serveur, et purgeons les caches, avec la ligne de commande suivante :
$ cd RACINE_DU_SITE
$ php bin/php/ezcache.php --clear-all --purge
5/2011
eZ Publish
Pour afficher notre nouveau fichier template pagelayout.tpl en front-office, nous allons donc sur la page
d’accueil http://nounours.local. Deux solutions s’offrent
à nous :
• Nous modifions ce fichier en ajoutant par exemple
un texte lambda, et vérifions que ce dernier s’affiche bien.
• Nous activons le debug et vérifions que le fichier
est bien pris en compte : connectons-nous dans
le back-office, puis dans la colonne de droite, activons le mode de débogage du siteaccess du frontoffice uniquement.
→ capture d’écran colonne_droite_activation_debug_plain_
site.png
→ capture d’écran mode_debug_on_front-office.png
De manière générale, nous pouvons également visualiser tous les autres fichiers templates (inclus ou pas)
pris en compte sur la page d’accueil du site.
Nous allons maintenant nous atteler à créer la page
en front-office d’un produit. Nous allons donc écrire le
fichier template correspondant en le créant dans l’arborescence des fichiers dans notre extension et le rendre
actif. Créons les répertoires conteneurs et le fichier,
pour obtenir l’arborescence suivante :
RACINE_DU_SITE/extension/t_nounours/design/nounours_
front/override/templates/full/
product.tpl
Nous éditons ce fichier en affichant les attributs de la
classe produit :
→ extension/t_nounours/design/nounours_front/override/
templates/full/full_product.tpl
Pour activer ce fichier et lui faire correspondre la vue
full à chaque contenu de type produit, nous éditons
le fichier RACINE _ DU _ SITE/extension/t _ nounours/
s ett i n gs/site ac c ess/pla i n _ site/ov errid e.i n i.
(surchargeant donc override.ini) en y ajoutant le code suivant en début de fichier :
append.php
→ full_produit_mickey.png
Bien sûr l’affichage est rustique, nous ne détaillerons
pas le métier de webdesign dans cet article. Pour
connaître les nombreuses possibilités de configuration, vous pouvez consulter le contenu des liens utiles
de ce chapitre.
Conclusion
Bien sûr l’exemple donné n’est qu’un affichage simple
de données simples, basé sur une configuration simple.
Pour plus d’informations sur les possibilités de configurations, nous pouvons consulter la documentation en
ligne : http://doc.ez.no.
Liens utiles :
• http://doc.ez.no/eZ-Publish/Technical-manual/4.x/
Reference/Scripts/Generic/ezcache.php - La documentation sur le script de gestion du cache eZ Publish,
• http://doc.ez.no/eZ-Publish/Technical-manual/4.x/
Reference/Configuration-files/override.ini - Le système de surcharge.
En savoir plus
Lorsque vous aurez créé votre site internet, il vous sera
utile et intéressant d’approfondir les notions suivantes :
•
•
•
•
•
•
•
•
•
•
•
L’écriture d’un workflow.
L’écriture d’un module.
L’écriture d’un datatype.
L’écriture d’un cronjob.
La configuration multilingue ou multisite.
Le versionning.
La fonctionnalité d’e-commerce.
Les rôles et droits.
L’extension eZ Find.
La gestion poussée du cache.
Bien d’autres encore...
Vous avez accès en ligne à la documentation en ligne
http://doc.ez.no, le site communautaire http://share.
ez.no, les flux http://www.planet-ezpublish.fr et http://
www.planetezpublish.org, ainsi que bien d’autres sites.
[full_product]
Source=node/view/full.tpl
MatchFile=full/full_product.tpl
Subdir=templates
Match[class_identifier]=product
En ayant au préalable vidé le cache pour prendre en
compte cette nouvelle configuration ainsi que le template ajouté, nous avons en front-office http://nounours.local/Peluches/La-peluche-Mickey-Mouse :
phpsolmag.org/fr
JEAN-LUC NGUYEN
Jean-Luc NGUYEN développe depuis plus de 8 ans en langage PHP.
Il a débuté sur eZ Publish 3.6, et est développeur certifié eZ Publish. Il
travaille actuellement au sein de la société Publicis Modem, à Paris.
Son site internet : www.acidre.com.
45
Sécurité
PF et OpenBSD
adapté aux PME
Beaucoup de PME ont en commun des besoins de sécurité et
notamment en matière de pare-feu. Il existe de nombreux choix
matériels sur le marché et les UTM ont depuis plusieurs années
inondés le marché de la sécurité internet. Dans cette multitude de
choix, il existe des outils Open Source en licence libre qui peuvent
parfaitement convenir aux PME, couvrir 100% de leurs besoins, tout
en étant simple à configurer.
Cet article explique :
Ce qu’il faut savoir :
• OpenBSD - système d’exploitation libre, sous licence BSD.
• Packetfilter - pare-feu logiciel.
• Notions de sécurité.
O
penBSD est un système d’exploitation libre,
sous licence BSD, dérivé de la famille Berkeley
System Distribution. C’est un système de type
Unix dérivé directement du code de celui-ci. Plus précisément, OpenBSD comme la plupart des autres systèmes d’exploitation BSD est dérivé de la version 4.4
de BSD.
Il existe aujourd’hui plusieurs variantes du système
BSD, parmi celles-ci OpenBSD est celle qui est la
plus reconnu dans le domaine de la sécurité. Ceci tout
d’abord grâce à l’incorporation dans le système de base
d’un grand nombre d’outils de sécurité, d’autre part pour
la politique adopté par les développeurs, avec notamment de nombreuses phases d’audit de code.
La famille BSD et la famille Linux sont différent techniquement. En effet, les noyaux BSD offre moins de fonctionnalité que les noyaux Linux permettant en contrepartie une stabilité, une performance et une sécurité
bien supérieure. Côté licence, la famille BSD est soumis à la licence BSD permettant d’utiliser les logiciel
sans restriction.
effet l’état des connections (TCP par exemple) et agit
en conséquence à l’arrivé d’un nouveau paquet. Il s’accompagne d’un outil de contrôle pfctl permettant d’interagir avec PF.
Bien souvent imaginé comme obscur, il existe des produits packagés tels que pfsense issue de l’autre grand
produit phare de la famille BSD : FreeBSD. Ce système
permet de s’affranchir de la ligne de commande et de
configurer l’ensemble de la sécurité sur une interface
web.
Descriptif PF
Packetfilter (PF) est le pare-feu logiciel embarqué dès
l’installation dans les systèmes OpenBSD. Au même
titre que Netfilter, il est stateful et capable de réaliser
un certain nombre d’opérations sur les paquets durant leurs traitement. Concrètement cela signifie que
PF garde en mémoire dans des tables prévues à cet
46
Figure 1. Schéma d’architecture
5/2011
OpenBSD
Ce qu’il faut savoir
PF est activé et stateful par défaut sur les systèmes
OpenBSD. Il est capable de base de faire de la translation d’adresse, du filtrage, de la normalisation, de la
gestion de QoS ou encore de la haute disponibilité native, etc …Et, last but not least…. PF fonctionne selon
le principe du last matching rule wins autrement dit et
pour un paquet, les règles sont analysées une à une, et
la dernière qui concerne le paquet l’emporte…
OpenBSD étant un produit de sécurité, il est livré de
base avec les principaux modules de chiffrement tel
que le 3DES et l’AES. L’outil pfctl permet d’effectuer
des actions telles que :
Pfctl –e
# Active le filtrage
Pfctl –d # Désactive le filtrage
Pfctl –ss # Affiche la table d’état Pfctl –sr # Affiche les règles actives
Et bien d’autres choses encore…
Les possibilités de PF et outils annexes
Grâce à ses tables d’état internes, PF a été prévu pour
se coupler avec de nombreux outils tels que spamd
fournit nativement sur OpenBSD, ou les IPS comme
snort. Au final, tous outils qui lors d’un évènement sont
capables d’effectuer une commande peuvent potentiellement interagir avec PF.
CARP est l’outil qui permet de réaliser de manière
simple de la redondance en Actif/Passif. L’outil couplé avec pfsync permet de préserver les tables de
session pendant le temps de basculement. Toutefois,
il n’est pas possible avec CARP d’effectuer de l’Actif/
Actif. OpenBSD et squid sont totalement compatible et
peuvent apporter une brique de filtrage URL et proxy
web à l’entreprise.
Ipsecctl est capable de créer des tunnels IPsec site
à site, et est interopérable avec des implémentations
constructrices telles que Cisco ou Checkpoint. Il est
également possible dans le cadre de la haute disponibilité de synchroniser les Security Associations (SA) et
les Security Policy Database (SPD) à l’aide de sasyncd.
D’autre part, vous pourrez configurer un remote accès
utilisateur à partir d’OpenBSD. OpenVPN peut être très
utile à OpenBSD pour effectuer du VPNSSL. Grâce à
authpf il est possible de modifier dynamiquement les
règles de filtrage en fonction de l’adresse IP d’un utilisateur. Cela permet alors de donner un accès privilégier
tant qu’il reste authentifier sur le pare feu.
OpenBSD est également interopérable avec Kerberos/LDAP permettant de mettre en place une authentification forte. On regrette que la connexion ne
puisse se faire que par rapport à un compte LDAP
et non un groupe de plusieurs utilisateurs. Toutefois, OpenBSD est assez puissant pour positionné la
granularité des accès et des règles PF au niveau de
l’utilisateur. Enfin, OpenBSD a fait le choix, pour des
raisons de sécurité, de ne pas faire d’inspection de
paquet et ne peut donc pas servir de proxy pour la
Visio ou pour la voix sur IP.
Pf et OpenBSDadapté au besoin d’une PME
Pour illustrer (voir Figure 1) notre propos, prenons
l’exemple d’une société qui souhaite mettre en place
une solution pare-feu. Pour une PME les besoins sont
souvent récurrents, leurs objectifs sont avant tout
d’avoir une fonction de pare-feu qui ne régule que certains flux et de pouvoir partager la connexion internet.
Pour plus de sécurité, certaines PME ont besoin
d’une haute disponibilité ou encore de connecter plusieurs sites en IPSEC. Dans notre cas, nous prendrons
en compte que l’interface vic1 est sur le LAN et l’interface vic0 sur le WAN.
Le NAT
Tout d’abord nous allons fournir une connectivité internet au membre de l’entreprise. Nous allons faire du
PAT sur l’adresse publique du pare-feu et nous n’auto-
Figure 2. Resultat pfsync firewall 1
Figure 3. Résultat pfsync firewall 2
phpsolmag.org/fr
47
Sécurité
riserons aux résidents que les ports les plus communs
(http, https, smtp, dns, …).
Editons donc le fichier /etc/pf.conf
#Déclaration des interfaces
ext = “vic0”
lan = “vic1”
#Regles
##
Blocagede tousblock in
block out all
all
#Tout d’abord nous activerons
sortant
le NAT pour les flux
match out on vic0 inet from $lan:network to any nat-to
$ext
#Nous autorisons ici le protocol icmp en sortie
pass out on $ext
proto icmp from $lan:network to any
#Enfin nous autorisons les requetes DNS et les flux
précédement cité
pass out on $ext
proto udp from $lan:network to any
pass out on $ext
proto tcp from $lan:network to any
port domain
port {80,443,25,110,143,993,995}
Bien sûr, cette configuration reste perfectible, mais
elle est néanmoins efficace pour fournir un accès internet à notre PME. Nous avons ici et en quelques
lignes créer un ensemble de règle permettant une
connectivité internet basique.
La documentation d’OpenBSD, étant très claire et exhaustive, nous ne détaillerons la syntaxe. Notons tout
de même l’effort mis par les développeurs afin que l’outil bénéficie d’une syntaxe pratique (avec l’utilisation de
tableau et de variable) et lisible facilement. Enfin vous
remarquerez que le principe du last matching rule wins
est ici appliqué : on met les règles par défaut en début
de fichier.
La syntaxe est assez similaire à celle de pfctl. Ici nous
avons créer en quelques ligne une configuration permettant
un tunnel IPSec de type Site à site utilisant un chiffrement
reconnu tel que AES. Bien sûr comme dit précédemment
ce système est interopérable avec plusieurs implémentations IPSec constructeurs. Il faut ensuite démarrer isakmpd
et appliquer les changements grâce à l’outil ipsecctl.
isakmpd –K
ipsecctl
Haute disponibilité
Pour sécuriser l’architecture, nous allons secourir le
pare-feu en actif/passif à l’aide d’une seconde machine
et effectuer de la redondance. Nous nous appuierons
sur les outils CARP et Pfsync fournit de base avec
OpenBSD. Côté CARP pour la redondance, nous allons
secourir l’interface Lan de notre firewall :
# sur f w 1
#Creation de l’interface carp (interface virtuelle)
172.16.235.253:root#Ifconfig carp1 create
#Configuration
# on configure une interface
afin de mettre en place le
protocol Carp
#Nous protegerons les communication à l’aide d’un mot de
passe : pass4carp1
172.16.235.253:root#Ifconfig carp1 vhid 235 pass
pass4carp1 carpdev vic1 advbase
0 advskew3
state master
172.16.235.254 netmask 255.255.255.0
#Creation de l’interface carp
172.16.235.252:root#Ifconfig carp1 create
#Configuration
172.16.235.252:root#Ifconfig carp1 vhid 235 pass
pass4carp1 carpdev vic1 advbase
IpSEC
Nous utiliserons un outil fourni de base avec les systèmes openBSD : ipsecctl qui permet de contrôler l’établissement de tunnel IPSEC. Pour cela rien de plus
simple :
3 advskew30
statebackup
172.16.235.254 netmask 255.255.255.0
Main auth hmac-sha1 enc aes group modp1024 \
Ceci suffit à mettre en place la redondance sur l’interface LAN (vic1) du pare-feu. Il suffit alors en se reportant à la documentation de faire en sorte que ces
changements soient persistants. On peut également
mettre en place la même chose sur les interfaces Wan
s’il n’existe qu’une sortie internet. Côté Pfsync pour la
synchronisation des tables d’états pare-feu :
psk “H@kin9”
!Sur fw1
# Sur notre pare-feu
Ike esp from 172.16.235.0/24 to 10.0.0.0/24 peer
192.168.100.36 \
Quick auth hmac-sha1 enc aes \
# Sur la machine distante (ici une openBSD)
Ike esp from 10.0.0.0/24 to 172.16.235.0/24 peer
192.168.100.38 \
main auth hmac-sha1 enc aes group modp1024 \
quick auth hmac-sha1 enc aes \
psk “H@kin9”
48
-f /etc.ipsec.conf
Ifconfig pfsync0 syncdev vic0 syncpeer 172.16.235.252
!sur fw2
Ifconfig pfsync0 syncdev vic0 syncpeer 172.16.235.253
Ceci suffit à mettre en place une synchronisation des
tables d’état, c’est-à-dire synchronyser les informa-
5/2011
Sur Internet
•
•
•
•
http://www.openbsd.org
http://www.openbsd.org/faq/pf/fr/index.html
http://www.frameip.com
http://www.pfsense.org/
tions sur le flux circulant au travers du pare feu afin
de garantir un arrêt minimum pour les utilisateurs en
cas de bascule. Cette fonction remplace aisément un
boitier propriétaire qui nécessitera souvent pour faire
la même chose, l’achat d’une licence supplémentaire
pour accomplir une haute disponibilité avec synchronisation des tables d’états. Nous visualisons alors le résultat (voir Figure 2).
Attention, il est important de noter que pfsync ne synchronise pas les règles de filtrage, mais seulement la
table des états. Pour cela, des outils tels que rsync ou
dsh peuvent vous aider effectuer ce travail.
Conclusion
Pf et OpenBSD sont des outils très puissants permettant de gérer les mêmes fonctionnalités qu’un boitier
constructeur et pour la plupart de ses besoins, de manière native. De plus le mode de développement centralisé assure une cohérence et une interactivité très
poussée des outils de base de la distribution.
L’outil packet filter seul est un outil puissant qui couplé avec les autres outils d’OpenBSD permet de réaliser facilement un grand nombre de fonction qui ne sont
parfois disponible qu’en option sur le UTM destiné au
PME. Grâce à sa syntaxe, le produit est simple à maitriser, mais pour plus de facilité, les PME peuvent utiliser
un système dédié comme PFsense et ainsi bénéficier
d’une interface graphique et des mêmes fonctionnalités
qu’OpenBSD.
DAMIEN BOLUS : EXPERT TECHNIQUE FRAMEIP
Consultant réseau sécurité ToIP au sein de FrameIP. J’ai mené à bien
un grand nombre de mission tels que des intégrations diverses de
pare-feu ou des audits de sécurité. Cette diversité dans les missions
m’a permis de prendre en main beaucoup de solution du marché, incluant des solutions Open Source, et de me confronter au besoin de
clients.
CLÉMENT SANNIER : CHEF DE PROJET FRAMEIP
En tant que chef de projet chez FrameIP, ma mission principale est
de conseiller les clients sur des solutions de sécurité. J’aime pouvoir leurs proposés diverses solutions que ce soit constructeur ou Open
Source afin de répondre au mieux à leurs besoins et leurs philosophies.
phpsolmag.org/fr

Documents pareils