extension zip pour php - acidre.com · ... responsable de l’offre e-commerce chez smile ......

50

Upload: vudiep

Post on 10-Sep-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

9/20102

Extension ZIP pour PHP

9/20103

Extension ZIP pour PHP

303 Perimeter Center NorthSuite 300 Atlanta, GA 30346

Immeuble Technologies84-88 bd de la M° Marchand92400 Courbevoie

220 Rue Denis PapinHéliosis Batiment A13857 Aix-en-Provence

Paris Aix-en-provence Atlanta

Retrouvez la liste des postes ouverts sur: http://www.b-pack.fr/societe/carriere

Vous êtes passionné par les nouvelles technologies ?Rejoignez-nous, et participez à la création de la nouvelle génération de logiciels d’entreprises.

b-pack développe les applications des grandes entreprises du secteur privé et public pour la gestion des processus stratégiques finances et achats.

Web SSO*REST

(*) SOA, Interfaces, webservices, SOAP

oraclemysqlmssql

SGBD

PHPwindowslinux

Cloud

ApacheIIS

HTMLCSS

XML

Ajax

web 2.0

2

TABLE DES MATIÈRES

5/2011

2 5/2011

Le périodique phpsolutions est publié parSoftware Press Sp. z o.o. SK

Bokserska 1, 02-682 Varsovie, PologneTél. 0975180358, Fax. +48 22 244 24 59

www.phpsolmag.org

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

AVERTISSEMENTLes 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

VARIA6 ActualitésActualités du monde du développement.Christophe Villeneuve

8 Interview de François-Xavier BoisFrançois-Xavier Bois, Directeur associé de Kernix So-ftware

10 Interview de Florent SabourinFlorent Sabourin, Responsable de l’offre e-commerce chez Smile

OUTILS12 Les solutions Cloud à l’usage d’IkoulaJules-Henri GavettiIkoula, hébergeur informatique depuis 1998, est le le-ader du Cloud Computing en France. Avec plus de 8 000 machines virtuelles en production et plusieurs an-nées d’expérience dans la virtualisation, Ikoula déve-loppe 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...

PROJETS14 DOMPDF : créez des PDF à la volée à partir de HTMLYohann PoironDOMPDF est une bibliothèque écrite en PHP qui per-met de générer des documents PDF à partir de pages web au format HTML, mises en formes avec des feuil-les 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 main-tenu par des passionnés du web et des standards ac-tuels.

Table des matièresTable des matières

DOSSIER20 Mise en œuvre de XAMPPOlivier HeurtelXAMPP 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éveloppe-ment 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.

PRATIQUE30 SQL : les vuesCilia Mauro, Magali ContensinSavoir manipuler les vues permet de limiter l’accès à un sous-ensemble de données pour une catégorie d’utili-sateurs, de simplifier l’interrogation de la base et d’être indépendant du schéma relationnel en cas de modifica-tion de ce dernier.

35 Créer son site internet avec le CMS eZ PublishJean-Luc NguyenCréer un site internet, qu’il soit à titre personnel ou pro-fessionnel, 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, cho-isir EZ Publish peut être un choix judicieux.

SÉCURITÉ46 PF et OpenBSD adapté aux PMEBeaucoup de PME ont en commun des besoins de sécurité et notamment en matière de pare-feu. Il exi-ste 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 exi-ste des outils Open Source en licence libre qui peuvent parfaitement convenir aux PME, couvrir 100% de leurs besoins, tout en étant simples à configurer.

5/20116

Actualités

SismoLe projet sismo est un serveur de tests en continu, écrit en Fabien Poten-cier (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 pa-quets de dévelop-pement et sera un outil complémen-taire à votre se-rveur d’intégration continue. Lors de son utilisation, vo-us pourrez l’as-socier à tous vos COMITs. La confi-guration 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 pro-posé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éesLors de la navigation, vous pouvez vous retrouver devant un site web qui vo-us 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 :

• LetypedeCMSutilisé,leswebsframeworksouJS,lesvidéoplayers,des widgets, etc

• Des logiciels applicatifs ou la présence d’applications extérieures ouwebs services

Bien sûr, vous pourrez aussi connaître d’autres secteurs comme le e-commer-ce, le type de javascript, les outils d’analyses, les bases de données et beau-coup d’autres informations utiles. L’ensemble du résultat est disponible directe-ment dans votre navigateur et ainsi vous évitez des opérations manuelles.

http://wappalyzer.com/

Rédaction des actualités :Christophe Villeneuve

Tour PHP 2011L’AFUP (Association française des Utilisateurs de PHP) ont annoncé le premier Tour PHP 2011 à Euratech-nologie 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.0Nginx 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éveloppe-ments. Il permet de faire tourner de nombreux langage comme PHP. Cer-taines plateformes l’utilisent comme Wordpress, Github. Enfin, Nginx est classé en 3eme position au niveau des baromètre serveur.http://nginx.org/

PhroznPhrozn est un projet PHP, dont le but est de vous permettre de générer un site statique en PHP. Il offre de nom-breuses 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éa-lisée en PHP, MySQL et Ajax. Il s’agit d’un système de gestion de commen-taires. 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/MYPHP-COM-SYSTEME-COMMENTAIRE-PHP-MYSQL_52995.aspx

Dolibarr 3.0La nouvelle version ERP/CRM Doli-barr, vient de sortir. Elle apporte de nombreuses évolutions et nouveau-tés comme l’amélioration de la sélec-tion 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/

opensourcewww.smile.fr

Paris Lyon Nantes Bordeaux Montpellier Aix Barcelone Kiev Genève Casablanca Amsterdam

Élu

Part

en

aire européen de l'année

Élu

Part

enaire européen de l'année

Spécialiste reconnu !Spécialiste reconnu !

Premier intégrateur européen de solutions open source

Smile recrute 200 personnes en 2011.Passionnés des technologies du web et de l’open source ?

Smile c'est aujourd'hui 500 collaborateurs, 11 agences et 18 domaines d'expertise.

Rejoignez nous !

5/20118

Interview

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épen-dants. 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 ou-vrages consacrés au PHP et à MySQL. Le dernier en date, publié chez Ey-rolles 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 sur-mesure. 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 com-pacts possibles. Notre intervention ne se limite cependant pas au développe-ment ; 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 mainte-nance. 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-

Interview de François-Xavier Bois, Directeur associé de Kernix Software

François-Xavier Bois

Directeur associé de Kernix Software

Interview

phpsolmag.org/fr 9

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, uti-lise des terminaux et emacs. Nous trouvons cepen-dant d’autres IDE ou éditeurs tels que Dreamweaver CS5, IntelliJ, Zend Development Environment ou No-tepad++. 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 com-plè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 techno-logie.

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 mai-trise 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 puis-sance de l’HTML5.

Chefs de projets et ingénieurs avant-vente sont éga-lement des profils pour lesquels nous sommes en re-cherche 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 !

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 comp-ter 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’ex-trême simplicité du langage, de sa rapidité d’exécu-tion, 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 na-mespaces. Ces fonctionnalités permettent de conce-voir 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 prin-cipale 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éve-loppements liés aux bases de données ? Quand pou-vons-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 ou-tils utilisateurs. Bien que cela ne soit pas préjudiciable pour l’instant, je pense qu’il est important de rester vi-gilant 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’uti-liser les outils qu’ils souhaitent du moment que la

5/201110

Interview

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 commer-cialiser 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 consul-tants 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 consul-tants en e-marketing appuyés par nos partenaires travaillent sur la médiatisa-tion du site (affiliation, référencement, réseaux sociaux) et proposent des solu-tions 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 vi-sible 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 excel-lents pour mesurer le comportement des internautes, nous proposons éga-lement 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

Interview de Florent Sabourin, Responsable de l’offre e-commerce chez Smile

Florent Sabourin

Responsable de l’offre e-commerce chez Smile

Contact :Smile48 rue de Villiers92300 Levallois-PerretTél. 01 41 40 11 00

Interview

phpsolmag.org/fr 11

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 Dru-pal Commerce - sur lesquelles nous comptons à l’avenir - sont suivies par notre équipe de veille technologique. Pour en savoir plus vous pouvez télécharger gratuite-ment 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 OsCom-merce 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 ab-solument 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 fonc-tionnel 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 impor-tantes. 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 bou-tiques installées dans le monde. S’il fallait désigner un vrai successeur à OsCommerce, c’est bien Prestas-hop !

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’applica-tions 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 glo-bale des boitiers TV rendent actif le consommateur et laisse penser que le T-commerce va être un concept à exploiter dans quelques années.

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 nou-veautés, il en sort tous les jours et les e-commerçants doivent se maintenir à la page pour rester concurren-tiels. Prenons par exemple Google Shopping qui est ar-rivé 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 no-tamment). 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 alter-natif combinant le meilleur des deux mondes : l’ouver-ture 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 mar-chand 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 ca-talogue 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’équipe-ment 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 Gi-bert 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 ex-cellent pôle de compétence sur ce produit et réalisons la plupart de nos sites avec cette solution.

5/201112

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.

phpsolmag.org/fr 13

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).

: pour profiter des fonctions standards d’Exchange (POP, IMAP, partage des ressources…) Le Pack Pro tout en ayant la possibilité de souscrire à des options payantes comme MAPI ou la synchronisation mobile… A partir de 0,99€/compte.

: pour utiliser la version complète d’Exchange 2010, avec toutes les fonctions Le Pack Entreprise 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 Toutes les questions/réponses sur Exchange 2010 disponible en ligne o Antispam et antivirus inclus o Offre découverte : 1 mois d’Hosted SharePoint offert (100 Mo, 1 site, 1 utilisateur) o 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 o Une infrastructure haute disponibilité avec des équipements redondants

5/201114

Projets

dompdf 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

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� 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�à pas comment réaliser la conver� 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.

dompdf : créez des PDF à la volée à partir de HTMLDOMPDF 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 :• Laprésentationduprojetdompdf.• Commentutiliserdompdf?• Fonctionnementdedompdf.• DesexemplesdeproductionsPDF.• dompdfetlesCMS.

Ce qu’il faut savoir :• Des notions sur les technologies Web.• Des notions de Programmation Orientée Objet.

DOMPDF

phpsolmag.org/fr 15

$dompdf->stream(„document.pdf”, array(„Attachment”

=> true));. Bien s�r vous avez la possibilité de dé��r vous avez la possibilité de dé�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 dompdfdompdf étant en fait un moteur de rendu HTML avec comme support un document PDF, il suit les mêmes

La première ligne permet d’inclure le fichier de confi�ère ligne permet d’inclure le fichier de confi�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�ère comme son nom l’indique permet de char�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�ère opération traite récursivement les dif�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 :

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());

5/201116

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é :

• ledocumentHTMLestchargéparl’extensionDOMde PHP, un arbre DOM est alors construit,

• unarbredeFrames est construit, à l’image de l’ar�à l’image de l’ar� 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,

• lafeuilledestyleCSSpardéfaut(quiétaitd’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 lessé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,

• chaqueStyle permettra de définir à quel type de FrameReflower, FramePositioner et FrameDecora-tor 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,

• toutestmaintenantpr�tpourlaisserlamagieopé�êt pour laisser la magie opé�t pour laisser la magie opé�rer : on lance le reflow de la Frame racine, qui va récursivement lancer celui des autres Frames,

• àlafindureflow de chacune des Frames, un Ren-derer est créé en fonction encore une fois du style : c’est la peinture du mur de briques. C’est à ce mo�à ce mo� ce mo�ment làquedompdfécritdanslefichierPDF,

• à chaque changement de page, les Frames, leur élément de DOM et leur FrameReflower, FramePo-sitioner, 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/visu-ren.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 Fra-meFactory 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�à lui va passer un coup de pin� 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 :

• labibliothè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

DOMPDF

phpsolmag.org/fr 17

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;

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

5/201118

Projets

Figure 3. Quelques types de border supportés

Figure 2. Support des transformations 2D CSS

DOMPDF

phpsolmag.org/fr 19

• laPDFLib, gratuite et limitée ou payante et très ra�ès ra�s ra�pide (car c’est une extension PHP écrite en C),

• oubienGD,quipermetde faire le rendusuruneimage (PNG, JPEG ou GIF). Ce choix limite le rendu à 1 page cependant, et est encore expéri�à 1 page cependant, et est encore expéri� 1 page cependant, et est encore expéri�mental.

Danslaplupartdescas,Cpdfestsuffisant,etc’estluiqui 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 PDFUne page d’exemples est mise à disposition par Fa�à disposition par Fa� 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 :

• Supportdestransformations2DCSS(Figure2).• Quelquestypesdebordersupportés(Figure3).

Dompdf et les CMSUne 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/, • CodeIngniter: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 !

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�ête à ac�te à ac�à ac� 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�èque mais que vous voulez quand même don�que mais que vous voulez quand même don�ême don�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�à le suivre pour toute informa� 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.

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.

YOHANN POIRONAutodidacte en matière de développement de sites en PHP, j’ai to-ujours 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 par-ler de ma veille personnelle et de mon quotidien professionnel auto-ur des réflexions et commentaires sur les thèmes des nouvelles tech-nologies, des services innovant, du développement, de l’interopéra-bilité dans le domaine médical, des réseaux sociaux et du buzz mar-keting. http://www.blog-nouvelles-technologies.frJe suis actuellement engagé en tant que responsable interopéra-bilité et développeur Web pour la société Openxtrem pour laquel-le je réalise des développements permettant de commercialiser le système en tant que pur EAI (Enterprise Application Integration) po-ur les structures de santé, en faisant l’extraction des fonctionnalités ‚métier’ (bloc, plan de soins, etc...). http://www.openxtrem.com

5/201120

Dossier

Présentation de XAMPPPour 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 con�i��me si l’installation et la con�i�me si l’installation et la con�i�guration de ces di��érents produits n’est pas di��icile 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 di��usé par Apache Friends, un projet sans but lucrati� destiné à promouvoir le serveur Web Apache.

XAMPP présente de nombreux atouts :

• Ilesttrèsfacileàinstaller(télécharger,décompres�ser, démarrer).

• Il incorpore un très grand nombre de produits etd’outils utiles pour le développement.

• Il propose quelques petits programmes d’exemples.

• Le projet est vivant et propose très régulièrementde nouvelles versions incluant les mises à jours ré�centes des di��érents produits.

XAMPP est disponible pour plusieurs plates��ormes :

Mise en œuvre de XAMPPXAMPP 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 :• L’installationdeXAMPPpourLinux.• L’administrationdeXAMPPpourLinux(démarrage,arrêt,sau-

vegarde).• Ledéveloppementd’unepetiteapplicationquiaccèdeàune

base de données MySQL.• LasécurisationdeXAMPPpourLinux.

Ce qu’il faut savoir :• LescommandesdebasesousLinux.• LesbasedelaprogrammationHTML,PHPetSQL.

Figure 1. Le logo de XAMPP Figure 2. Le répertoire d’installation

XAMPP

phpsolmag.org/fr 21

• libxml2.7.6• libxslt1.1.26• Ming0.4.2• Webalizer2.21-02• pdfclass009e• ncurses5.3• mod_perl2.0.4• FreeTDS0.63• gettext0.17• IMAPC-Client2007e• OpenLDAP(client)2.3.11

• Linux(testésousUbuntu,SuSE,RedHat,Mandrivaet Debian),

• Windows(2000,2003,XP,Vistaet7),• SolarisSPARC(version10),• MacOSX(version10.4pourIntel&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 version1.7.4sortiefin janvier2011.Cettedernière in-ère in-re in�clut notamment les produits suivants :

• Apache2.2.14• MySQL5.1.41• PHP5.3.1• Perl5.10.1• ProFTPD1.3.2c• phpMyAdmin3.2.4• OpenSSL0.9.8l• GD2.0.1• Freetype2.1.7• libjpeg6b• libpng1.2.12• gdbm1.8.0• zlib1.2.3• expat1.95.2• Sablotron1.0

Figure 3. Démarrage de XAMPP pour Linux

Figure 5. La page d’accueil de XAMPP pour Linux

Figure 4. Démarrage de XAMPP pour Linux Figure 6. La page de statut de XAMPP

5/201122

Dossier

• mhashlibrary0.8.18• mcryptlibrary2.5.7• cURL7.19.6• SQLite2.8.17(forPHP4+PHP5)• SQLite3.6.16(forPHP5PDOSQLite)• eAccelerator0.9.5.3• FPDF1.6• bzip2(library)1.0.5

Sur le site Apache Friends (http://www.apachefrien-ds.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 �orum de discus�à un �orum de discus� un �orum de discus�sion.LadernièreversiondeXAMPP,ainsiquelesver-èreversiondeXAMPP,ainsiquelesver-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 LinuxPour installer XAMPP, nous devons nous connecter en tant qu’administrateur système(root)à notre serveur.

Nous allons commencer par télécharger la version 1.7.4deXAMPPà partir du site Apache Friends :

wget http://www.apachefriends.org/download.php?xampp-

linux-1.7.4.tar.gz

Un fois le téléchargement terminé, il suffit d’extrairel’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.Vousdevriezobtenir l’arborescencesuivante sur /opt(voirFigure2).Ilneresteplusqu’àdémarrerXAMPP(voirFigure3):

/opt/lampp/lampp start

Et voilà, c’est (déjà) fini, il ne reste plus qu’à vérifierque tout �onctionne correctement en démarrant votre navigateur préféré et en saisissant l’URL http://local-host si vous �tes en local ou http://serveur à partir d’uneautremachine.Vousdevriezvoirapparaîtreunepage qui permet de choisir le langage à utiliser (voirFigure4).

Cette page est a��ichée uniquement lors du premier accèsàXAMPP� le langagesélectionnéestmémori-èsàXAMPP� le langagesélectionnéestmémori-sàXAMPP� le langagesélectionnéestmémori-àXAMPP� le langagesélectionnéestmémori-XAMPP� le langagesélectionnéestmémori�

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épertoireTéléphonique PHP + SQLite phonebook.php

phpinfo() PHP phpinfo.php

Tableau 1. Liste des exemples

Figure 7. L’application de démonstration „Collection de CD”Figure 8. Exemple de résultat obtenu avec l’application de démonstration „Instant Art”

LAMPP ou XAMPP ?Auparavant ce logiciel s’appelait LAMPP, mais il a été re-nommé „XAMPP pour Linux” en 2003. Cela explique pourquoi le répertoire d’installation et le script de contrôle de XAMPP s’appellent lampp.

XAMPP

phpsolmag.org/fr 23

sé sur le serveur dans le �ichier /opt/lampp/htdocs/xam-pp/lang.tmp.Unefoislechoixdelalangueeffectué,lapaged’accueildeXAMPPdevraits’afficher(Figure5).C’est tout bon !

Petit tour du propriétaireLa page d’accueil de XAMPPLa page d’accueil de XAMPP contient plusieurs liens qui permettent de véri�ier l’état du logiciel, de tester les

Tableau 2. Principaux répertoires et fichiers

Tableau 3. Actions possibles du script /opt/lampp/lampp

Répertoire/Fichier Contenu/opt/lampp/backup/ Répertoirededestinationdessauvegardes.

opt/lampp/bin/ RépertoiredesexécutablesetfichiersdecommandesfournisavecXAMPP.VousytrouverezparexemplelesutilitairesdeMySQL(mysql,mysqldump,etc.),ceuxd’Apache(apachectl,htpasswd,etc.),etbiend’autres.

/opt/lampp/htdocs/ RépertoireracineduserveurWebApache(DocumentRoot).

/opt/lampp/etc/ Répertoiredesfichiersdeconfigurationdesdifférentsproduits(voir ci-dessous).

/opt/lampp/etc/httpd.conf Fichierdeconfigurationd’Apache.

/opt/lampp/etc/my.cnf FichierdeconfigurationdeMySQL.

/opt/lampp/etc/php.ini FichierdeconfigurationdePHP.

/opt/lampp/etc/proftpd.conf FichierdeconfigurationduserveurFTPProFTPD.

/opt/lampp/phpmyadmin/config.inc.php FichierdeconfigurationdephpMyAdmin.

/opt/lampp/lampp UtilitairedecontrôledeXAMPP(présentédanslasuite).

Action Fonctionstart DémarrerXAMPP(Apache,MySQL,ProFTPDetéventuellementd’autresproduits).

startapache DémarreruniquementApache(avecPHPetlesupportSSL,saufsicedernieraétéexplicitementstoppéau-paravantaveclacommandestopssl).

startssl DémarreruniquementlesupportSSL(etPHP) ;sileserveurApacheestlancé,ilestredémarréaveclesupportSSL.

startmysql Démarrer uniquement MySQL.

startftp DémarreruniquementProFTPD.

stop ArrêterXAMPP(Apache,MySQL,ProFTPDetéventuellementd’autresproduits)

stopapache ArrêteruniquementApache

stopssl ArrêteruniquementlesupportSSL ;sileserveurApacheestlancé,ilestredémarrésanslesupportSSL (maisavecPHP).

stopmysql ArrêteruniquementMySQL.

stopftp ArrêteruniquementProFTPD.

reload RechargerXAMPP(Apache,MySQL,ProFTPDetéventuellementd’autresproduits)

reloadapache RechargeruniquementApache.

reloadmysql RechargeruniquementMySQL.

reloadftp RechargeruniquementProFTPD.

restart RedémarrerXAMPP(équivalentdestoppuisstart).

restartapache RedémarreruniquementApache(équivalentdestopapachepuisstartapache).

security VérifieretconfigurerlasécuritédeXAMPP(abordéultérieurement).

php5 ActiverPHP5(actuellementsansintérêtpuisquePHP5estactivépardéfautetquec’estlaseuleversion disponible).

phpstatus Afficher la version de PHP qui est active.

backup SauvegarderXAMPP(abordéultérieurement).

panel DémarrerlepanneaudecontrôlegraphiquedeXAMPP(voirci-dessous).

status AfficherlestatutdeXAMPP(Apache,MySQLetProFTPD).

version Afficher la version de XAMPP.

5/201124

Dossier

petits programmes de démonstration ou d’accéder aux outils. Le lien Statut a��iche une page qui permet de voir cequiestdémarréoupas(Figure6).

Le lien Sécurité a��iche une page qui permet de vé�ri�ier le niveau de sécurité de l’installation de XAM�PP �nousy reviendronsultérieurement.LeLienDo-cumentation a��ichage une page contenant elle�m�me plusieurs liens vers les documentations o��icielles desprincipauxproduits (notammentApache,PHPet MySQL)etversquelquestutorielssurPHP,HTMLetPerl. Le Lien Composants a��iche une page donnant la liste de tous les logiciels inclus dans la distribution, avec pour chacun d’entre eux un lien vers leur site o��i�ciel respecti�.

Les applications de démonstration et les outilsXAMPP présente six applications de démonstration. Les �ichiers source de ces exemples sont stockés dans le répertoire /opt/lampp/htdocs/xampp. Le lien phpinfo() a��iche le résultat de l’appel à la �onction PHP phpinfo() et permet donc de voir très précisément la con�iguration de PHP, et notamment les extensions disponibles.

XAMPP propose aussi deux outils bien pratiques, phpMyAdmin, la célèbre application Web de gestion desbasesdedonnéesMySQL,ainsiqueWebalizer,la non moins célèbre application d’analyse du tra�ic d’un site Web. Dans la suite de cet article, nous ver�rons comment utiliser phpMyAdmin pour créer la pe�

tite base de données utilisée dans notre application de test.

Emplacement des fichiersToutcequiest fourniavecXAMPPse trouvedans lerépertoired’installation(/opt/lampp en ce qui concerne cetarticle)�vousytrouvereznotammentlesprincipauxrépertoiresetfichiersprésentésdansleTableau2.

Contrôler XAMPPLe script /opt/lampp/lampppermetdecontrôlertrèspré-èspré-s pré�cisément XAMPP. Son utilisation est très simple :

/opt/lampp/lampp <action>

Le panneau de contrôle graphique de XAMPP per�met d’arr�ter ou de démarrer XAMMP ou l’un des trois composantsprincipaux(Apache,MySQL,ProFTPD) �ilal’allureprésentéedanslaFigure9.Cepanneaudecontrôle nécessite un environnement graphique opé�rationnel(XWindow,GTK)ainsiquePython(aveclesmodulesPyGTKetctypes).

Si le lancement du panneau avec la commande /opt/lampp/lampp ne fonctionne pas (erreur du styleundefined symbol: FT_GlyphSlot_Embolden), vous pou�vezessayerdelalancerdirectementaveclacommande

Figure 9. Panneau de contrôle graphique de XAMPP

Figure 10. Création de la base de données

Figure 11. Création de la table

Nom Type Null Index AUTO_INCREMENTid INT Non PRIMARY Oui

isbn VARCHAR(20) Oui

titre VARCHAR(100) Non

Tableau 4. Structure de la table livres

XAMPP

phpsolmag.org/fr 25

/opt/lampp/share/xampp-control-panel/xampp-

control-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.apache-friends.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 typeRedHatouMandriva,vouspouvezprocéderdela manièresuivantedansunesessionroot(testéavecsuccès sur une distribution Centos).Créezunliensymboliquevers/opt/lampp/lampp dans

/etc/init.d :

ln -s /opt/lampp/lampp /etc/init.d/lampp

Ajouter le service lamppdans laconfigurationdedé�marrage :

chkconfig --add lampp

Pour in�ormation, le script /opt/lampp/lampp est confi�guré pour démarrer XAMPP dans les niveaux de dé�marrage3,4et5.

Développer une petite applicationMaintenant que XAMPP est installé et démarré, nous al�lons pouvoir tester l’écriture et le déploiement d’une petite (toutepetite!)application.Pourchangerdelasempiter�nelle démonstration Hello World, nous allons développer

Figure 12. Définition des colonnes de la table

Figure 14. Affichage initiale de la page

Figure 13. Saisie d’un premier livre

Figure 15. Saisie d’un nouveau livre

Listing 1. Le script pub.inc.php

<?php

// Préparation de valeurs pour l’affichage.

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.

function dbConnect() {

$source = ‘mysql:host=localhost;dbname=pub’;

$utilisateur = ‘root’;

$motDePasse = ‘’;

$db = new PDO($source, $utilisateur, $motDePasse);

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_

EXCEPTION);

return $db;

}

// Exécution d’une requete.

function dbExecute($db,$sql) {

$requete = $db->prepare($sql);

$arguments = func_get_args();

array_shift($arguments);

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) {

return $requete->fetch();

}

?>

5/201126

Dossier

une petit application qui a��iche 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.

Pour commencer, nous allons donc utiliser phpMyAd�min pour créer notre base de données et notre table. Surlapaged’accueildeXAMPP,cliquezsurlelienphp-

Listing 2. Le script livres.php

<?php

@include_once(‘pub.inc.php’);

$message = null;

try {

// Se connecter a la base de données.

$db = dbConnect();

// Déterminer si une action particuliere est requise,

et si oui,

// faire le nécessaire.

// Ce serait une bonne idée de vérifier la validité

des données en entrée ...

switch (@$_GET[‘action’]) {

case ‘ajouter’:

$sql = ‘INSERT INTO livres(isbn,titre)

VALUES(:p0,:p1)’;

dbExecute($db,$sql,$_POST[‘isbn’],$_

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=”UTF-

8”?>’,”\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/

css” />

</head>

<body>

<?php if (empty($message)): ?>

<!-- Liste des livres -->

<table border=”1” cellpadding=”4” cellspacing=”0”>

<tr align=”center”>

<th>Identifiant</th><th>ISBN</th><th>Titre</

th><th>Action</th>

</tr>

<?php

$supprimer = ‘<a onclick=”return confirm(\’Est-ce

bien raisonnable ?\’);” ‘ .

‘href=”livres.php?action=supprimer&a

mp;id=%s”>supprimer</a>’;

while ($ligne = versPage(dbFetch($requete))) {

printf

(

‘<tr><td>%s</td><td>%s</td><td>%s</

td><td>%s</td></tr>’,

$ligne[‘id’],$ligne[‘isbn’],$ligne[‘titre’],s

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”

value=”Ajouter” /></td></tr>

</table>

</div>

</form>

<?php else: ?>

<!-- Message d’erreur éventuel -->

<div class=”red”><?php echo versPage($message);

?></div>

<?php endif; ?>

</body>

</html>

XAMPP

phpsolmag.org/fr 27

MyAdmin. Sur la page d’accueil de phpMyAdmin, sai�sissezlenomdelanouvellebasededonnée(pub) puis cliquezsurleboutonCréer (Figure10).Unefoisquelebasededonnéesestcréée,vousac�

cédezà la page d’administration de cette nouvelle base dedonnées.Danscettepage,définissezunenouvelletable nommée livres et comportant trois colonnes puis cliquezsurleboutonExécuter (Figure11).Ensuite,définissezlestroiscolonnesdelatablelivres

présentéesdansleTableau4(Figure12).Saisissezlesréférences de ce livre (recommandé par l’auteur �-)),puiscliquezsur leboutonExécuter (Figure13).C’est�ini 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é�initions de �onctions utiles(voirListing1).Commevouspouvezleconstater,nousutilisonsPDO

pour accéder à la base de données. Passons mainte�à la base de données. Passons mainte� la base de données. Passons mainte�nant au script livres.php qui va se charger de toute la gestiondenotrepage(voirListing2).Lapremièrepar-èrepar-re par�tie du script contient principalement du code PHP et se chargedegérerlalogiqueapplicative(plutôtsimpliste!). La deuxième partie du script contient principalement ducodeHTMLetsechargedel’affichagedelapage.Pour terminer, nous allons dé�inir la petite �euille de style pub.cssutiliséedanslapage(voirListing3).

Notre application est pr�te�ilnenousresteplusqu’à la déployer sur le serveur a�in de la tester. Pour cela, nous allons créer un répertoire pub dans /opt/lampp/htdocs et y copier nos trois �ichiers pub.inc.php, pub.css

et livres.php.Ouvronsmaintenantnotrenavigateurpré�féréetsaisissonsl’URLdenotrepage(http://localhost/pub/livres.php ou http://localhost/pub/livres.php).VousdevriezobtenirlerésultatmontrédanslaFigure14.Pourtesterl’ajoutd’unnouveaulivre,vouspouvezsaisir

les in�ormations suivantes puis cliquer sur le bouton Ajouter (Figure 15). VousdevriezalorsobtenirlerésultatprésentédanslaFigure16.Jevouslaissetesterlasuppression.

SécurisationPar dé�aut, l’installation de XAMPP n’est pas du tout sé�curisée. Si cela peut ne pas poser de problème pour un

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;

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;

}

Figure 16. Résultat de la saisie d’un nouveau livre

Figure 17. Le statut initial de sécurité de XAMPP

Figure 18. Sécurisation de XAMPP

5/201128

Dossier

environnement de développement, il n’en est évidem�ment pas de m�me pour un environnement de produc��me pour un environnement de produc�me pour un environnement de produc�tion. Le statut de sécurité de XAMPP peut �tre véri�ié en cliquant sur le lien Sécuritédelapaged’accueil(voirFigure17).

Comme le montre cette page, il existe plusieurs pro�blèmes de sécurité :

• LespagesdeXAMPP(statut,exemples,outils)nesont pas protégées et tout le monde peut y accé�der.

• L’utilisateur pma de phpMyAdmin n’a pas de mot de passe.

• L’administrateurdeMySQL(root)n’apasdemotdepasse.

• Lemotdepassepardéfautdel’utilisateurFTPno-Lemotdepassepardéfautdel’utilisateurFTPno�body est inchangé.

Pour corriger ces problèmesdesécurité,vouspouvezutiliser la commande suivante en tant que root :

/opt/lampp/lampp security

Cette commande exécute un petit utilitaire interacti� quivérifieleniveaudesécuritédel’installationetvouspermetderésoudrelesproblèmessignalésendéfinis-èmessignalésendéfinis-messignalésendéfinis�santdesmotsdepasse(voirFigure18).Une fois l’opération terminée, vous devrez saisir le

nom d’utilisateur lamppetlemotdepassequevousavezdé�ini pour accéder aux pages de XAMPP : http://local-host/xampp/ ou http://serveur/xampp/ (voirFigure19).Danslapagerelativeà lasécurité,vousdevriezmain-à lasécurité,vousdevriezmain- lasécurité,vousdevriezmain�tenantobtenir lesstatutsprésentésdans laFigure20.De m�me, pour accéder àphpMyAdmin(http://localhost/phpmyadmin/ ou http://serveur/phpmyadmin/), il vous faudradorénavant saisir unnomd’utilisateur (root par exemple)etlemotdepasseassocié(voirFigure21).

Par ailleurs, si le mot de passe de l’utilisateur root de MySQL a été dé�ini, l’exemple Collection de CD ne fonctionneplus.Pourrésoudreleproblème,ilfautédi-ème,ilfautédi-me, il �aut édi�ter le �ichier /opt/lampp/htdocs/xampp/cds.php et ajou�ter le mot de passe dans les appels à mysql_connect.

SauvegardeL’utilitaire de contrôle de XAMPP permet de sauvegar�dertrèsfacilementvotreenvironnement(basededon-èsfacilementvotreenvironnement(basededon-sfacilementvotreenvironnement(basededon�

Figure 19. Authentification pour accéder aux pages de XAMPP

Figure 20. Le statut de sécurité de XAMPP après correction

Figure 21. Authentification pour phpMyAdmin

XAMPP

phpsolmag.org/fr 29

nées, �ichiers de con�iguration, �ichiers htdocs). Pour cela, il su��it de saisir la commande suivante en tant que root : /opt/lampp/lampp backup

Si un mot de passe a été dé�ini pour l’utilisateur root deMySQL,vousdevezl’ajouterà la �in de la ligne de commande.Malheureusement,danslaversion1.7.4,ily a un bug qui emp�che la commande de �onctionner correctementetvousobtenezuneerreurperformance_schema: FAILED.Ceproblèmepeut�trerésoluenédi-èmepeut�trerésoluenédi-me peut �tre résolu en édi��tre résolu en édi�tre résolu en édi�tant le script /opt/lampp/share/lampp/backup et en ajou�tant la condition -o ‟$i” = ‟performance_schema” au testdelaligne39:

# 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�onctionne sans problème(Figure22).Lasauvegardese matérialise par un script shell (original !) xampp-backup-dd-mm-yy.sh stocké dans le répertoire /opt/lampp/backup/ � ce fichier doit lui m�me �tre sauve-�me �tre sauve�me �tre sauve��tre sauve�tre sauve�gardé en lieu sûr !Encasdebesoin,ilestpossiblederestaurerunesau�

vegarde, sur la m�me machine, ou sur une autre ma��me machine, ou sur une autre ma�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 su��it d’exécuter le script qui correspond à la sauvegarde, par exemple sh xampp-backup-18-02-11.sh. Là encore, si

un mot de passe a été dé�ini pour l’utilisateur root de MySQL,vousdevezl’ajouteràlafindelalignedecom-à la �in de la ligne de com� la �in de la ligne de com�mande.Commevouslevoyez,vouspouvezavoirbesoinde

redémarrer XAMPP. Petite précision trouvée sur le site Apache Friends, je cite : Tout devrait marcher parfaite-ment. Mais toujours penser que cette fonction est en-core en développement et qu’elle n’est disponible qu’en version Bêta. A bon entendeur, salut !

ConclusionA travers cet article vous avez pu constater que XAMPPestunproduittrèsfacileàinstalleretàadmi-èsfacileàinstalleretàadmi-s �acile à installer et à admi�à installer et à admi� installer et à admi�à admi� admi�nistrer, mais nous n’avons �ait qu’entre�apercevoir toute sarichessefonctionnelle.N’hésitezdoncpasàl’instal-à l’instal� l’instal�ler pour voir tout ce qu’il propose.

Figure 22. Sauvegarde

Figure 23. Restauration d’une sauvegarde

OLIVIER HEURTELAprès plus de huit ans passés en société de service, où il a successive-ment 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 Professio-nal et a rédigé plusieurs livres sur PHP et Oracle publiés aux Éditions ENI.

5/201130

Pratique

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 res-treints, 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 utili-sateur 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

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 vueCette 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 SQLLa 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

SQL : les vuesSavoir 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 :• L’intérêtdesvues.• Commentlescréeretlesutiliser.

Ce qu’il faut savoir :• BasesdeSQL:manipuleretinterrogerlesdonnées.

SQL : les vues

phpsolmag.org/fr 31

Créer une vue verticaleLa vue verticale sélectionne un sous-ensemble de co-lonnes d’une ou plusieurs tables. La requête SELECT com-porte 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 jointureLes 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éve-loppeur 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 com-porte quatre colonnes : le titre du livre, sa date de paru-tion, 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 groupeLa vue de groupe, comme celle de jointure, simplifie l’écri-ture 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 vueLa 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 :

[WITH [CASCADED|LOCAL] CHECK

OPTION];

La clause optionnelle WITH CHECK OPTION définit le com-portement 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 colonnesPar 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 don-né à 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 co-lonnes 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 horizontaleLa 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 mon-trer 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éces-saires au vendeur du rayon policier :

CREATE VIEW livre_policier AS

SELECT * FROM livre WHERE genre =

‘policier’;

5/201132

Pratique

CREATE VIEW titre_nom AS

SELECT titre, nom FROM info_livre;

Interroger une vueUne fois créée, il est possible d’interroger une vue de la même manière qu’une table normale, avec la com-mande 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 verti-cale provoquera une erreur. Par exemple, si la colonne quantite est supprimée de la table livre, la vue verti-cale 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 suppri-mer la vue et la recréer.

Mettre à jour les données d’une vueLes vues sont généralement utilisées pour extraire des informations de la base, mais il est possible, sous cer-taines 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 va-leurs à leur affecter, alors la vue acceptera les modifica-tions de données.

Vérifier si la mise à jour est possibleLors 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 re-quêtes INSERT, DELETE et UPDATE seront rejetées. La va-leur de ce champ peut-être obtenue avec la requête :

SELECT * FROM information_schema.VIEWS;

Conditions de mise à jourPour permettre la modification de données (insertion, suppression, mise à jour), une vue doit respecter les conditions suivantes :

• 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 in-terne (pas de jointure externe) et la requête de modification ne porte que sur une table sous-jacente,

• 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_paru-tion), 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-12498-

1’,’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’au-teur Baudelaire, la modification est réalisée automati-quement 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.’

SQL : les vues

phpsolmag.org/fr 33

WHERE titre = ‘fleurs du mal’ AND nom

= ‘Baudelaire’;

MySQL affiche un message indiquant que la modifi-cation 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éesLes 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 sup-primé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, dis-ponible 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 migra-tion de données. C’est-à-dire que l’opération est inter-dite 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 uni-quement à la vue courante. Le mot-clé CASCADED indique que la vérification s’applique à la hiérarchie de vue (va-leur 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 vue _ livre3 sont définies par rapport à vue _ livre :

CREATE VIEW vue_livre2 AS

SELECT * FROM vue_livre WHERE date_

parution > 1600 WITH LOCAL CHECK

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 se-ra 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 res-trictions 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 vueLa commande SQL DROP VIEW supprime la définition de la vue :

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 sup-pression 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érialisationLorsque le SGBD rencontre une référence à une vue dans une requête, il utilise la définition de la vue pour

34

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 celles-ci 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érialisa-tion 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 choi-sit 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.

ConclusionDans 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 CONTENSINCilia 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] Contensin est chef de projet en développement d’applica-tions au CNRS. Elle enseigne depuis plus de dix ans le développe-ment 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

Sur Internet• http://dev.mysql.com/doc/refman/5.0/fr/views.html

eZ Publish

phpsolmag.org/fr 35

Pour 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 Pu-blish fonctionne principalement avec le langage de pro-grammation PHP5, une base de données SQL, un ser-veur Apache et un système d’exploitation Linux (LAMP). D’autres configurations de serveur sont également pos-sibles, voir les liens utiles.

Pourquoi et quand utiliser eZ Publish ?Lorsque l’idée de choisir un framework (CakePHP, Sym-fony, etc...) est écartée parce qu’il est nécessaire de dé-velopper un back-office, ou que repartir d’un dévelop-pement 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 fonc-tionnalités correspondant, ou pas, aux besoins du ca-hier 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 argu-ments spécifiques qu’il propose, c’est-à-dire principale-ment le langage de programmation sur lequel il est basé, les extensions ou plugins que la communauté ou la so-ciété éditrice propose, toujours nécessairement en rap-port aux besoins fonctionnels, sa communauté de déve-loppeurs 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

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écharge-ment. Les principaux logiciels concurrents d’eZ Publish sont Drupal, Typo3, Joomla, SPIP, voire même Wor-dpress.

La solution eZ Publish est tout d’abord et surtout puis-sante par sa flexibilité; De manière générale, un site in-ternet 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 intro-duction, un texte). Dans eZ Publish, la structure décri-vant 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_ pu-blish/technical_manual/4_0/images/concepts_and_

Créer son site internet avec le CMS eZ PublishCré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 :• Après lecturede cet article, vousaurezunevision théoriqueet

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.

Ce qu’il faut savoir :• Pour comprendre cet article, il est souhaitable de posséder

des connaissances basiques sur Linux, Apache, MySQL, ainsique de solides compétences en programmation PHP5.

5/201136

Pratique

tiple-languages - Le concept de classes de conte-nu multilingues.

Configuration serveurAvant de commencer à modifier la configuration ser-veur, 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’environne-ment local), Apache, MySQL et PHP.

Les chapitres suivants donnent des exemples basés sur un site internet dont le nom de domaine www.nou-nours.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...).

LinuxBien sûr, nous n’allons pas détailler et expliquer l’ins-tallation 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 tour-ner 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 programma-tion 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 li-mitation du nombre de caractères d’un fichier (très vite atteint sur eZ Publish), la lenteur d’exécution d’eZ Pu-blish avec un système de fichiers NTFS, un environne-ment de développement doit tout d’abord être proche

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 ajou-ter une extension ou un plugin comme le nécessite-raient certains CMS. De même, le système de ver-sionning d’eZ Publish est inclus par défaut dans son noyau.

ConclusioneZ Publish est un CMS parmi tant d’autres, il possède ses forces et ses faiblesses, nombreux sont les com-paratifs 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-dru-pal-vs-joomla-and-typo3 - Discussion des diffé-rents CMS sur le forum officiel d’eZ Publish,

• http://phpsolmag.org/fr/magazine/1629-ez-publish-guide-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-

Figure 1. L’interface du back-office eZ Publish sur les dernières versions

5/201138

Pratique

d’un environnement de production. Sans oublier la base même des concepts de logiciels libres.

ApacheAvant 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 :

/var/www/nounours.

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

$ cd /etc/apache2/sites-available/

# 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

# Exécutons la commande suivante pour prendre en compte

la nouvelle configuration

$ /etc/init.d/apache2 reload

Bien sûr, n’oublions pas de déclarer les 2 URLs (front-office et back-office) définies dans le virtual host, dans notre fichier hosts :

$ sudo gedit /etc/hosts

→ fichier hosts.conf

En testant les URLs http://nounours.localet http://ad-min.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.

MySQLNous allons donc créer notre base de données vide nommée s_nounours à travers l’interface locale de php-MyAdmin, 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

PHPLes 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

installée

$ php -v

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.Figure 2. Le panneau de configuration du mode DEBUG

eZ Publish

phpsolmag.org/fr 39

# Cette commande permet de connaître la version

d’ImageMagick installée

$ convert -version

ConclusionNombre de configurations logicielles sont possibles, mais optimiser son environnement de développement permet de gagner en temps, en confort de programma-tion, et bien sûr en argent.

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 CMSIl 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 Compo-nents. Cette dernière a d’ailleurs été soumise à et vali-dé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 sai-sissons 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 si-teaccess du front-office (plain _ site) et du back-office (plain _ site _ admin), et nous sélectionnons bien sûr la base de données nommée s_nounours..

• Nous créons les identifiants du compte super admi-nistrateur 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 :

Figure 3. En mode édition, nous avons accès à diverses informations du contenu édité

5/201140

Pratique

→ fichier backoffice_accueil.png

→ fichier frontoffice_accueil.png

ConclusionInstaller 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émonstra-

tion en vidéo.

Comprendre et configurer eZ Publish, le contenuAvant 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 fonction-nalités possibles, en cliquant sur les cinq onglets prin-cipaux.

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 : pro-duit, catégorie et page. En allant dans Administration >

Figure 4. Page d’accueil après l’installation

eZ Publish

phpsolmag.org/fr 41

Classes > Content, nous remarquons que l’installation ba-sique 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 in-formations suivantes. Exemple sur la classe produit :

# Ceci est le nom de la classe au format humain

Nom : produit

# Ceci est le nom de la classe au format informatique

Identifiant : product

# 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

l’attribut title, mais remarquons

donc qu’eZ Publish permet de

personnaliser l’URL d’un contenu en

créant par exemple un autre attribut

nommé url.

Modèle de génération de l’URL : <title>.

Le Tableau 1 récapitule la structure de la classe pro-duit. 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égo-rie (en cochant conteneur, les catégories ayant des

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 ob-jets.

Voici l’arborescence que nous créons, à partir de la racine (Nom, puis entre parenthèses, la classe de contenu).

→ EZ Publish (Folder)

→ Peluches (Catégorie)

→ La peluche Mickey Mouse (Produit)

→ La peluche Minnie Mouse (Produit)

→ La peluche Donald Duck (Produit)

→ Poupées (Catégorie)

→ Mélanie (Produit)

→ Arthur (Produit)

→ Mentions légales (Page)

→ La société (Page)

Chaque nœud de l’arborescence se crée de la ma-nière suivante :

> Contenu > Sélection de la classe > Créer un nouvel

objet > Saisie du contenu de chaque

attribut > Publier

Après la publication d’un objet, notons que ce der-nier possède, entre autres, les propriétés sui-vantes : un contentobject _ id et un node _ id. Le contentobject _ id est l’entier identifiant unique asso-cié à l’objet, alors que le node _ id est l’identifiant as-socié à 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

5/201142

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 configurationComme 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 fi-chiers 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 fi-chiers 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 surchar-gé le bloc [SiteAccessSettings], nous pouvons égale-ment surcharger d’autres variables de bloc.

ExempleLe 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 plain _ site

(siteaccess du front-office). Parallèlement, dans le

Figure 6. L’interface d’installation d’eZ Publish

eZ Publish

phpsolmag.org/fr 43

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 regrou-pons 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 RACINE_DU_SITE/settings/siteaccess/plain_site, soit RACINE_DU_SITE/settings/siteaccess/plain_site_admin.

Dans les chapitres suivants, nous définirons les si-teaccesses (front-office et back-office) par le mot-clé ###SITEACCESS###.

ConclusionLa notion de surcharge d’un siteaccess est une fonc-tionnalité propre à eZ Publish. Elle permet s’associer une valeur de variable de configuration propre à un si-teaccess uniquement, ou de l’étendre à tous les siteac-

Figure 7. Ce que le mode DEBUG ON affiche en front-office

5/201144

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 égale-ment à d’autres répertoires et fichiers.

Liens utiles :• http://doc.ez.no/eZ-Publish/User-manual/4.x/Daily-

tasks/Publishing-at-multiple-locations - La notion de multi-emplacements,

• http://doc.ez.no/eZ-Publish/User-manual/4.x/The-administration-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 templatesUn 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 partiedunoyau. 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 unique-ment propre au CMS. De la documentation est dispo-nible sur ce lien : →http://doc.ez.no/eZ-Publish/Techni-cal-manual/4.x/Templates.

Surcharge d’un templateAvant de nous lancer dans la programmation d’un tem-plate, il nous faut le créer. Nous allons donc créer l’ex-tension de notre projet nounours et l’activer, en suppo-sant que nous travaillons dans la société Tartepempion. Comme dans tout projet web ou informatique, il est vi-vement recommandé de suivre des best practices lors de la création de répertoires.

Nous allons créer l’arborescence des sous-réper-toires suivants :

RACINE_DU_SITE

> extension

# Nous préfixons notre extension par la première lettre

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/

design/standard/templates/pagelayout.tpl 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-of-fice : c’est le template conteneur principal.

Pour le prendre en compte, il est nécessaire de défi-nir dans un fichier de configuration l’existence du réper-toire (2). Nous créons le fichier design.ini.append.php sous RACINE_DU_SITE/extension/t_nounours/settings/.

→ 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éper-toires nouvellement créés possèdent les bons droits serveur, et purgeons les caches, avec la ligne de com-mande suivante :

$ cd RACINE_DU_SITE

$ php bin/php/ezcache.php --clear-all --purge

eZ Publish

phpsolmag.org/fr 45

Pour afficher notre nouveau fichier template page-layout.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’af-fiche 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, acti-vons le mode de débogage du siteaccess du front-office 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 visua-liser 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’arbo-rescence 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/

settings/siteaccess/plain _ site/override.ini.

append.php (surchargeant donc override.ini) en y ajou-tant le code suivant en début de fichier :

[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 tem-plate ajouté, nous avons en front-office http://nou-nours.local/Peluches/La-peluche-Mickey-Mouse :

→ 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 configura-tion, vous pouvez consulter le contenu des liens utiles de ce chapitre.

ConclusionBien 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 configu-rations, 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 docu-mentation sur le script de gestion du cache eZ Pu-blish,

• http://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Configuration-files/override.ini - Le sys-tème de surcharge.

En savoir plusLorsque 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.

JEAN-LUC NGUYENJean-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.

5/201146

Sécurité

OpenBSD 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 sys-tè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 notam-ment de nombreuses phases d’audit de code.

La famille BSD et la famille Linux sont différent techni-quement. En effet, les noyaux BSD offre moins de fonc-tionnalité que les noyaux Linux permettant en contre-partie une stabilité, une performance et une sécurité bien supérieure. Côté licence, la famille BSD est sou-mis à la licence BSD permettant d’utiliser les logiciel sans restriction.

Descriptif PFPacketfilter (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 du-rant leurs traitement. Concrètement cela signifie que PF garde en mémoire dans des tables prévues à cet

effet l’état des connections (TCP par exemple) et agit en conséquence à l’arrivé d’un nouveau paquet. Il s’ac-compagne d’un outil de contrôle pfctl permettant d’inte-ragir avec PF.

Bien souvent imaginé comme obscur, il existe des pro-duits 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.

PF et OpenBSD adapté aux PMEBeaucoup 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 :• OpenBSD-systèmed’exploitationlibre,souslicenceBSD.• Packetfilter-pare-feulogiciel.

Ce qu’il faut savoir :• Notionsdesécurité.

Figure 1. Schéma d’architecture

OpenBSD

phpsolmag.org/fr 47

également possible dans le cadre de la haute disponi-bilité 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 utili-sateur. 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 Ker-beros/LDAP permettant de mettre en place une au-thentification forte. On regrette que la connexion ne puisse se faire que par rapport à un compte LDAP et non un groupe de plusieurs utilisateurs. Toute-fois, 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 PMEPour 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 cer-tains 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 plu-sieurs sites en IPSEC. Dans notre cas, nous prendrons en compte que l’interface vic1 est sur le LAN et l’inter-face vic0 sur le WAN.

Le NATTout d’abord nous allons fournir une connectivité inter-net au membre de l’entreprise. Nous allons faire du PAT sur l’adresse publique du pare-feu et nous n’auto-

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 trans-lation d’adresse, du filtrage, de la normalisation, de la gestion de QoS ou encore de la haute disponibilité na-tive, 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 annexesGrâ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 potentiel-lement interagir avec PF.

CARP est l’outil qui permet de réaliser de manière simple de la redondance en Actif/Passif. L’outil cou-plé 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

Figure 2. Resultat pfsync firewall 1

Figure 3. Résultat pfsync firewall 2

5/201148

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 all

block out all

#Tout d’abord nous activerons le NAT pour les flux

sortant

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

port domain

pass out on $ext proto tcp from $lan:network to any

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 in-ternet à 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 ex-haustive, nous ne détaillerons la syntaxe. Notons tout de même l’effort mis par les développeurs afin que l’ou-til 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.

IpSECNous utiliserons un outil fourni de base avec les sys-tèmes openBSD : ipsecctl qui permet de contrôler l’éta-blissement de tunnel IPSEC. Pour cela rien de plus simple :

# Sur notre pare-feu

Ike esp from 172.16.235.0/24 to 10.0.0.0/24 peer

192.168.100.36 \

Main auth hmac-sha1 enc aes group modp1024 \

Quick auth hmac-sha1 enc aes \

psk “H@kin9”

# 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”

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émenta-tions IPSec constructeurs. Il faut ensuite démarrer isakmpd et appliquer les changements grâce à l’outil ipsecctl.

isakmpd –K

ipsecctl -f /etc.ipsec.conf

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

3 advskew30 statebackup

172.16.235.254 netmask 255.255.255.0

Ceci suffit à mettre en place la redondance sur l’in-terface LAN (vic1) du pare-feu. Il suffit alors en se re-portant à 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 :

!Sur fw1

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-

phpsolmag.org/fr

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 synchroni-sation des tables d’états. Nous visualisons alors le ré-sultat (voir Figure 2).

Attention, il est important de noter que pfsync ne syn-chronise 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.

ConclusionPf et OpenBSD sont des outils très puissants permet-tant de gérer les mêmes fonctionnalités qu’un boitier constructeur et pour la plupart de ses besoins, de ma-nière native. De plus le mode de développement cen-tralisé 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 cou-plé avec les autres outils d’OpenBSD permet de réali-ser 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 à maitri-ser, 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 FRAMEIPConsultant 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é, in-cluant des solutions Open Source, et de me confronter au besoin de clients.

CLÉMENT SANNIER : CHEF DE PROJET FRAMEIPEn tant que chef de projet chez FrameIP, ma mission principale est de conseiller les clients sur des solutions de sécurité. J’aime pouvo-ir leurs proposés diverses solutions que ce soit constructeur ou Open Source afin de répondre au mieux à leurs besoins et leurs philoso-phies.

Sur Internet• http://www.openbsd.org• http://www.openbsd.org/faq/pf/fr/index.html• http://www.frameip.com• http://www.pfsense.org/