41138978-ajax-et-php-php-10-2010

Upload: kyao7050

Post on 19-Jul-2015

94 views

Category:

Documents


0 download

TRANSCRIPT

5/200912 10/2010www.phpsolmag.org 3Table des matires4TABLE DES MATIRES10/20104 10/2010Le priodique phpsolutions est publi parSoftware Press Sp. z o.o. SKBokserska 1, 02-682 Varsovie, PologneTl. 0975180358, Fax. +48 22 244 24 59 www.phpsolmag.orgPrsident de Software Press Sp. z o.o. SK : Pawe MarciniakDirectrice de la publication :Ewa ozowickaDpt lgal : parutionISSN : 1731-4593Rdacteur en chef : ukasz BartoszewiczCouverture : S awomir SobczykDTP : S awomir Sobczyk [email protected] : S awomir SobczykCorrection : Valrie Viel, Thierry Borel, Barbara BourdellesBta-testeurs : Brice Favre, Valrie Viel, Cyril David, Christophe Milhau, Alain Ribault, Stphane Guedon, Eric Boulet, Mickael Puyfages, Christian Hernoux, Isabelle Lupi, Antoine Beluze, Timote Neullas, Yann Faure, Adrien Mogenet, Jean-Franois Montgaillard, Turmeau Nicolas, Jonathan Marois, Wilfried Ceron, Wajih Letaief, Franois Van de Weerdt, Eric Vincent, Franck Michal Assi, Francis Hulin-Hubard, Nicolas Dumas, David Michaud.Les personnes intresses par la coopration sont pries de nous contacter :[email protected] : [email protected] crer les diagrammes on a utilis le programme AVERTISSEMENTLes techniques prsentes dans les articles ne peuvent tre utilises quau sein des rseaux internes. La rdaction du magazine nest pas responsable de lutilisation incorrecte des techniques prsentes. Lutilisation des techniques prsentes peut provoquer la perte des donnes !VARIA6 ActualitsActualits du monde du dveloppement.Christophe VilleneuvePROJETS8 Solution de stockage base sur ZFS et UbuntuOlivier OlejniczakLa virtualisation de PC a amen de nouveaux besoins. Alors que la concentration de serveurs fonctionnels vir-tualiss par serveur physique de virtualisation saccrot, la demande en termes de capacit de stockage et de fiabilitdesquipementssaccrotgalement.Dans cet article vous verrez comment mettre en uvre une solutiondestockagedetrslargecapacitetscuri-se accessible en NFS ou ISCSI depuis le rseau local (exemple : serveur de virtualisation).DOSSIER20 AJAX et PHPJean TatareauLaugmentationdesdbitsInternetetdeladiversit dapplicationssurPCmaisaussidediffrentstermi-naux,mobiles,tablettes,assurentlaprsenceincon-tournable dAJAX. Dans cet article, nous apprendrons pourquoi et comment est n le concept Ajax, son utili-sation avec PHP. Nous aborderons les avantages de la communication asynchrone et ses limites, les solutions apportes et sa mise en uvre.PRATIQUE34 Crer son propre hbergementAlexandre BazzetNous verrons dans cet article comment crer un serveur dhbergement web avec un minimum de scurit. Dans unepremirepartienousinstallerons/configureronsun AMP(Apache+MySQL+PHP),puisnousinstallerons des logiciels tiers pour les serveurs FTP, DNS, etc. Table des matires Table des matiresSCURIT49 Introduction la scurit webNicolas TurmeauUn dveloppeur quel quil soit peut raliser de grands projets.Maisquellechutefait-illorsqueleditprojet vientdtredtruitparuneattaque?Detrshaut, tellement haut que certains en abandonnent tout es-poir. Dans cet article nous tudierons les bonnes pra-tiqueslesplussimplesavoirpourviteraumaxi-mum cette situation.POUR LES DBUTANTS39 SQL : langage de dfinition des donnesCilia Mauro, Magali ContensinDenombreusesapplicationsWeb(forums,galeries dimages, sites marchands, ) reposent sur des bases de donnes. Linteraction avec la base de donnes, la cration de la base et des tables, la manipulation des donnes, ainsi que le contrle des droits daccs aux donnes sont raliss avec le langage SQL. Les bases dedonnessonttrsutilisesdanslesapplications Web. La cration, linterrogation et la manipulation des donnes de la base sont ralises en SQL. Dans cette sriedarticlesvousapprendrezlelangageSQLain-si que les bases ncessaires pour communiquer avec une base de donnes partir dun script PHP.6Actualits10/2010OpenTBS 1.4OpenTBS est un outil PHP qui vous per-metdegnrerdeschiers OpenO ce et Ms O ce partir de modles que pro-posent ces logiciels. Il sappuie sur le mo-teurTinyButStrongetutiliselalibrairie zLib.Lesdocumentsgnrspeuvent treproduitssousformedunchier enregistrsurleserveur,duntlchar-gementdirect,oummedunchane binaire si besoin. http://www.tinybutstrong.com/fr/eZ Publish 4.4LanouvelleversionduCMSeZPublishestdisponible.Elleapportedenom-breuses nouveauts comme lamliora-tion de linterface dadministration pour faciliterlagestiondecontenu,lvolu-tion de la partie dition des images avec la possibilit de modier directement le contenu,lesoutienduformatHTML5, desvolutionsducotdelutilisateur... Par ailleurs, eZ Systems cratrice du CMS eZPublishinvitelacommunautpar-ticiperaudveloppementdecelui-ci. Cest--direlacompagnieouvrelepro-cessus de dveloppement de son coeur. http://ez.noLAFUP fdre la communaut PHPLerendez-vousdumomentconcerne le Forum PHP, qui se droulera le 9 et 10novembre2010.Pourcetvnement lAFUP runit de nombreux acteurs PHP (RasmusLerdof,ZeevSuraski,Derrick Rethans, et Ilia Alshanetsky...),SQL avec laprsencedescrateursdeSkySQL (Kaj Arn, Michael Monty Widenius). Et propose aussi un espace Projets PHP et beaucoup dautres chose dcouvrir http://www.afup.org/forumphp.Magix CMSMagixCMSpassesouslicenceOpen Source,toutengardantlesfonction-nalitspremiresduCMS:bassurle rfrencement.Cetteversionpropose plusdefonctionnalitsdebaseavec une interface plus simplie.http://www.cms-php.beSpeed test mini PHPIlsagitduneapplicationmulti-lan-gageetquiatlibrepourvous permettredetestervotrebandepas-sante.Celle-cifonctionneavecdif-rentslangagesetpeuttreinstalle sur votre propre serveur sous la forme dun nouveau service supplmentaire. http://www.speedtest.net/mini.phpSabreDAV 1.3.0SabreDAV vous permet dajouter facile-mentWebDAVuneapplicationPHP. EndployantWebDAV(ouSabreDAVprcisment) vous pouvez utiliser votre applicationwebcommesilsagissait dunsystmedechierspourlesutili-sateurs. Cette nouvelle version apporte une volution du cache et de la classe.http://code.google.com/p/sabredav/SkySQL Ab, lalternative MySQL OracleEn ce mois doctobre, les yeux se sont penchs sur le secteur des bases de donnes et principalement MySQL. SkySQL Ab est la nouvelle socit dont le but principal est de sengager dans lOpen Source. Elle est fonde et finance par 100% danciens cadres et investisseurs de MySQL, et est en train de devenir le nouveau centre de lcosystme MySQL. Loffre de SkySQL Ab reposesur une alternative de logiciels, services et assistance pour la base de donnes MySQL, cest dire : MySQL Server, est une offre alternative parfaitement able, scurise etconomiquepourlesutilisateursdesolutionsdebasededonnes propritaires. Le serveur MySQL peut tre utilis pour toutes les appli-cations de base de donnes en production. Maria DB Server, est une alternative compatible MySQL, qui peut aus-si intgralement remplacer le serveur de base de donnes MySQL.En plus,denouveauxdriversapparaissentpourtreutilissavecZend Framework, Drupal... SkySQL Entreprise Monitor, est un administrateur de base de donnes MySQL dans une bote. SkySQLVisualEditor,estunditeurderequteSQLetpermetaux administrateurs de base de donnes de dployer plus rapidement et ef-cacement leurs serveurs de base de donnes MySQL. L'assistance technique SkySQL permet aux clients de maximiser la dis-ponibilit et la performance de leurs applications de base de donnes. SkySQL offre la fois une assistance de rsolution des problmes (er-reursgnrales,coupuresdeserviceetusagegnral)etuneassis-tance consultative (pour aider lamlioration dun dploiement spci-que). Enfin, Kaj Arn, co-fondateur de SkySQL Ab et Monty Widenius, crateur de MySQL et fondateur de Monty Program Ab, seront prsents en exclusi-vit mondiale au Forum PHP 2010http://www.skysql.com/Rdaction des actualits :Christophe Villeneuve7

www.phpsolmag.org

9/2010 2Extension ZIP pour PHP10/2010 8ProjetsLes solutions professionnelles de virtualisation pro-posentdesoptionsdehautedisponibilitentre serveurs de virtualisation mais, la condition que, les disques durs des machines virtuelles soient stocks dans un espace accessible tous les serveurs de votre ferme de virtualisation. Cet espace de stockage partag doit tre suffisamment volumineux pour pouvoir hber-ger lintgralit des disques durs de toutes les machines virtuelles. Il doit pouvoir accrotre sa capacit de stocka-gedslapparitiondenouveauxbesoins.Cetespace doit tre extrmement fiable car, en cas de panne, cest cette fois lintgralit des machines de tous les serveurs de virtualisation qui seront en panne. Les performances de cet espace de stockage devront tre suffisantes pour assumer les demandes en I/O de tous les serveurs vir-tualiss. La mise en uvre de la baiedoit videmment tre conomique afin de ne pas remettre en cause les avantages financiers de la virtualisation de serveurs.Dans un environnement idal, deux serveurs de vir-tualisation seront relis au travers de deux switches deux baies de stockages redondantes : Danslecadredecetarticle,nousnouscontenterons dunserveurdevirtualisationVmwareESXi1etdun baie de stockage quip de lOS Nexenta2.1http://www.vmware.com/fr/products/esxi/2http://www.nexenta.org/Lorsdunprcdentarticle,javaisdjdcrisune architectureunpeusimilaireenutilisantladistribution FreeNAS3;laquellesimplifiaitgrandementlagestion des disques, des volumes de stockage et de la redon-dance des disques et ladministration de la baie au tra-vers dune interface WEB4.Dansunautrearticle5,jaigalementprsentle ZFS6 qui est un systme de fichier dvelopp par SUN pour SOLARIS. Pour des raisons de licences, ZFS ne peut tre intgr au noyau Linux. ZFS prsente de trs nombreux avantages en termes de protection des don-nes, volumtrique et de performance7.1.ZFSmmoriselasommedecontrledesdon-nesstockessurledisquesouslaformeduncode en 256 bits. Ce code est vrifi chaque opration de sortequetoutecorruptiondesdonnesparunmat-riel dfaillant par exemple ne puisque passer inaperu (DMA, cache de disque dur...).2.ZFS utiliselecopyonwritecequisignifiequun bloc de donnes nest jamais modifi directement sur le disque. En cas de modification, les critures sont ra-lises dans un espace indpendant des donnes initia-les et si toutes les sommes de contrle concident, alors seulement, les nouvelles donnes sont valides.3http://freenas.org42009/09 Stockage dport avec FreeNAS: VMware ESXi, iSCSI et NFS52009/09 Gestion avance des disques sous Linux: Raid, LVM & ZFS6http://www.sun.com/software/solaris/zfs.jsp7http://opensolaris.org/os/community/zfs/docs/zfs_last.pdfSolution de stockage base sur ZFS et UbuntuLa virtualisation de PC a amen de nouveaux besoins. Alors que la concentration de serveurs fonctionnels virtualiss par serveur physique de virtualisation saccrot, la demande en termes de capacit de stockage et de fiabilit des quipements saccrot galement. Cet article explique : Commentmettreenuvreunesolutiondestockagedetrs largecapacitetscuriseaccessibleenNFSouISCSIdepuis le rseau local (exemple: serveur de virtualisation).Ce quil faut savoir : Cet article demande une bonne connaissance de larchitecture de stockage des PC et dun PC disposant dau moins trois dis-ques durs.Nexentawww.phpsolmag.org 98.ZFS est un systme qui volue puisque sont prvus sous peu le cryptage et la dduplication desblocs de donnes en temps rel.Juste titre dinformation, ZFS-FUSE (http://zfs-on-fuse.blogspot.com/)proposeaujourdhuiunportage sous GNU/Linux de ZFS en attendant la rponse libre ZFS: BTRFS8.Careneffet,ZFSnestpasunsystmedefichier libre.IlestdisponibledanslenoyaudeOpenSolaris9,doncgratuit,maissoncodesourcenestpasdispo-nible. Qu cela ne tienne me direz-vous ! Il est vrai que lescaractristiquesdecesystmeontdequoilever bien des objections un logiciel non libre.LeproblmeestquepassezOpenSolaris,cest aussi rapprendre tout un jeu de commande durement acquit sous GNU Linux. Je vous donne un petit aperu des diffrences entre les chemins systmes et les jeux de commandes:Heureusement, la communaut du librea entrepris latchedemigrerlesoutilsGNUversOpenSolaris. Ceciprendlaformedunedistributionhybrideentre OpenSolarisetUbuntuHardy8.04:NEXENTA.Ne-xenta existe en trois versions :8http://fr.wikipedia.org/wiki/Btrfs9http://fr.wikipedia.org/wiki/OpenSolaris3.ZFSinclutunsystmedesnapshot;cestdire quelonpeutaccderauxdonnestellesquellesta-ientuninstantdonnetcecimmesideschange-ments ont t oprs ensuite.4.ZFSorganiselesdisquessouslaformedepool.Ces quipes de disques peuvent tre redimensionnes et le niveau de redondance entre disques est ajustable (STRIPPING: pas de redondance; tous les disques sont fusionnsMIRROR:deuxdisquesontuncontenu identiquesactualissentempsrelRAIDZ/RAIDZ2: le pool peut perdre un ou deux disques sans pertes de donnes).Larpartitiondesdonnesentrelesdisqu-esestoptimisedefaontotalementautomatiqueen fonction des performances de chaque disque. On peut par exemple mlanger des disques SSD pour la vitesse et SATA pour la capacit.5.ZFS est un systme de fichier 128 bits. Ne cher-chez pas compterquelle capacit de disque cela fait; cest plus que vous nen aurez jamais besoin !6.ZFS peut contrler manuellement ltat des disqu-es (SCRUB soit lquivalent dun chkdsk) en temps rel sansdgradationdeperformances.Lesrparations sonteffectueslavoleetinscritesdansunjournal consultable par ladministrateur.7.Le jeu de commandes administratives utilises par ZFSesttrssimpleapprhendercommevaled-montrer cet article.Tableau 1. Comparaison de quelques dossiers systmes entre Linux et OpenSolaris Linux OpenSolaris /home /export/home /var/log /usr/adm, /var/adm, /var/log /tmp /var/tmp /sys /devices /dev /dev /lib/modules/foo/* /kernel/drv/* /boot/grub /rpool/boot/grubTableau 2. Comparaison des quelques commandes systme entre Linux et OpenSolaris sudo pfexec apt-cache search pkg search -r foo apt-get install foo pkg install SUNWfooapt-get dist-upgrade pkg image-update lsmod modinfo insmod modload rmmod modunload top prstat free vmstat cat /proc/cpuinfo psrinfo -v ifcong ifconfg -a parted format10/2010 10ProjetsNexentaCore:ils'agitdunedistributionenligne de commande (http://www.nexenta.org/ ). Cest cet-te version gratuite (license CDDL - http://www.sun.com/cddl/cddl.html)que nous utiliserons pour met-treenuvreunserveurdestockagerseauNAS utilisant la technologie ZFS.NexentaStor:Ils'agitd'unedistributionquivad-dierlePCoelleestinstallepourraliserune baiedestockage(http://www.nexenta.com/corp/ ). Cetteversionestentirementadministrabletra-vers une interface WEB et dispose dextensions d-dies (agent Vmware, client de backup Windows...). Cette version de Nexenta est payante mais dispose dun support professionnel. Sachez quil existe une versiondveloppeurgratuitejusqu4Todedon-nes utiles.StormOS : Cette distribution propose une station de travailgratuiteutilisantl'environnementdefentre XFCE(http://stormos.org).Nexentafonctionnesur les architectures 32bits et 64bits.Installation de NexentaDans ce chapitre, nous allons prsenter les diffrentes tapes dinstallation de la distribution Nexenta Core 3. Cettetapereprsentelagrandediffrenceavecune installationOpenSolaristypique.Parexemple,Nexen-ta permet linstallation de lOS sur un miroir de disques. Nexenta installe et configure automatiquement le servi-ce de console distance scuris SSH. Nexenta active par dfaut le service de partage iSCSI (target). Open-Solaris aurait ncessit des tapes de post-installation plutt laborieusesDsquevousaveztlchargpuisgravleCD dinstallationdeNexentaCore,dmarrezvotrePC depuisceLive-CD.Ensuite,choisissezlalangue dinstallation. Choisissez la zone gographique de votre PC. Choisissez le pays de localisation du PC. Vrifiez et validez lensemble de ces paramtres.Nexentadtecteensuitelintgralitdesdisques prsentsdansvotrePC.Commevouspouvezlecon-stater,lesconventionsdednominationdesdisques (C1t0d0)sonttrsdiffrentesdecequelontrouvera sous Linux (/dev/sda1). Par exemple, C1t0d0 est le pre-mierdisquedelapremirenappeducontrleur1.Je vous invite noter prcieusement ces informations ds maintenant car, si vous avez beaucoup de disques et/ou de contrleurs, elles vous seront bien utiles lors de la cration des pool de disques.Dsmaintenant,commejelementionnaisplustt dans cet article, vous pouvez slectionner deux ou trois disque afin dinstaller lOS Nexenta sur un Mirror (deux disques)ouunraidz(troisdisquesquivalentun RAID5). Validez le fait que vous tes bien daccord po-urformaterlesdisquesprcdemmentslectionns. Ilesttempsdedfinirlemotdepassedelutilisateur root. Attention, bien que vous ayez choisi une installa-Figure 1. Site de Nexenta CoreFi ure 1:Site de Nexenta Core Figure 2. Site de NexentaStorFigure 3. Site de StormOSNexentawww.phpsolmag.org 11tion en franais, le clavier est rest en anglais (bug !?!).Confirmez que vous avez bien fini de dfinir le mot de passe. Saisissez maintenant le nom dun nouvel utilisa-teur sans privilges systme . La procdure est identi-quecelledelutilisateurrootlexceptionquevous devez dfinir lidentifiant. Confirmez les paramtres de crationdunouvelutilisateur.Maintenant,lasquen-ce dinstallation de NexentaCore va dfinir les caract-ristiquesrseauxdevotredistribution.Indiqueztout dabord le nom et le domaine auquel appartient ce PC. Confirmez les informations saisies.Linstallateur va maintenant dtecter toutes les car-tes rseaux installes. Attention veiller ce que votre matriel entre bien dans la grille de compatibilit de So-laris. Sun propose dailleurs sur un site une applet JAVA qui contrle la compatibilit avec Solaris du matriel sur lequel elle est excute10. Dans le cadre de cet article, le PC ne contient quune carte rseau fonctionnant au Confirmation avant validation du mot de passe de rootgigabit. Bien videmment, en production, vous avez to-ut intrt multiplier le nombre de cartes afin dajouter quilibrage de charge et autre disponibilit votre baie de stockage.Vous devez dcider si la carte rseau se verra at-tribueruneadresseIPparleserveurDHCPdevo-trerseauoubiensivoussouhaitezluiaffecterune adresseIPstatique.Ilestprfrabledechoisirune IPstatique,prservantlefonctionnementdelabaie mme en cas de dfaillance du serveur DHCP (lequel pourrait trs bien tre virtualis et stock dans la baie, par exemple).Saisissez ladresse et le masque de sous rseau que vous souhaitez pour la baie. Si votre rseau nutilise pas IPV6, il est inutile de demande le rglage suivant. Vali-dez que vous souhaitez bien appliquer les paramtres prcdents.Vousdevezalorsindiquerlapasserelle rseau qui sera applique toutes les cartes de la baie. Si vous nindiquez pas de passerelle, les mises jour parinternetdeNexentaCoreneserontpaspossibles. Saisissez ladresse IP de la passerelle. Vous devez au-ssi prciser ladresse dun serveur de nom DNS afin de terminer le rglage de la connexion de la baie Inter-net. Saisissez ladresse IP du ou des serveurs de noms de votre rseau.Les rglages sont termins ! Linstallation de la distri-bution va pouvoir commencer. Il ne vous reste plus qu patienter.Sachezquconfigurationmatriellegale, NexentaCore(ouOpenSolaris)estmoinsrapidesque Linux.ZFSestgalementtrsgourmanddemmoire vive.Une fois linstallation termine, relancez le PC. Reti-rez le CDROM et, au bout de quelques secondes, vous vous trouverez devant linvitation saisir vos identifiants pour accder la console dadministration.10 http://www.sun.com/bigadmin/hcl/hcts/device_detect.jspConnectez-vousaveclidentifiantdelutilisateur non privilgi et validez le fonctionnement de la couche rseau.Pour cela, tapez la commande suivante pour visuali-sez ltat de vos cartes rseau (Figure 27).Figure 4: cran de dmarrage du Live-CD NexentaCore Figure 5:Menu de choix de la langue d'installation Figure 6: Menu de choix de la zone gographique Figure 7: Menu de choix du pays du PC Figure 4. cran de dmarrage du Live-CD NexentaCoreFigure 5. Menu de choix de la langue dinstallationFigure 6. Menu de choix de la zone gographiqueFigure 7. Menu de choix du pays du PC10/2010 12Projets dla star-linkLINK CLASS MTU STATE BRIDGE OVERbnxO phys 1500 up - Pourvoirledtaildesrglagesdevoscartesrseau, tapez la commande (Figure 28). ifcong -aSi vous souhaitez modifier posteriori les caractristi-ques rseaux de votre PC, modifiez le fichier de confi-guration /etc/hostname.bnx0 avec lditeur nano. sudo nano /etc/hostname.bnx0Ce fichier contient une ligne qui ressemble ceci :192.168.1.38 netmask 255.255.255.0 broadcast+ upSI tout fonctionne correctement, vous pouvez lancer la mise jour de la distribution avec la squence de com-mande suivante : sudo apt-get update sudo apt-get upgradeVousnoterezlusagedesudoetdeapt-getportsde Ubuntu vers NexentaCore (ou aptitude si vous prfrez cet outil). Si vous devez relancer la machine, alors saisissez la commande suivante:sudo reboot -rCration des pools de disquesLors de son installation, NexentaCore a cr un pool de disque nomm syspool dans lequel il a plac les deux ou trois disques slectionns.Vouspouvezvisualisercepoolentapantlacom-mande :sudo zpool list NAMESIZE USED AVAIL CAP HEATH ALTROOT syspool 330G 1,13G 239G0% ONLINE -LOS utilise 1,3 Go du pool et celui-ci est en parfait tat demarche(statusONLINE).Vouslavezpeut-trere-marqumaisZFSretourneparfoisdesvaleurstran-gesencequiconcernelespacelibre(bug?!?).Ilne faut pas oublier quun pool organis en raidz utilise une partie de lespace disque pour stocker des sommes de contrle (tout le comme le ferait un RAID5). De plus, le systme de fichier hberg par ce pool peut tre com-press en temps rel.On peut visualiser lorganisation des disques au sein de ce pool avec la commande suivante: sudo zpool status syspool pool: syspool state: ONLINEFigure 9: Choix des disques o sera stock l'OS NexentaCore Figure 10: Dernire validation avant formatage des disques Figure 11: Dfinition du mot de passe de rootFigure 8: Validation des paramtres gographiques Figure 8. Validation des paramtres gographiquesFigure 9. Choix des disques o sera stock lOS NexentaCoreFigure 10. Dernire validation avant formatage des disquesFigure 11. Dnition du mot de passe de rootNexentawww.phpsolmag.org 13 scrub: none requested cong:NAMESTATEREADWRITE CHKSUMsyspool ONLINE 000mirror ONLINE 000c0t0d0s0ONLINE 000c0t1d0s0ONLINE 000Les lignes ci-dessus signifient que syspool est compo-s de deux disques placs en miroir (RAID1). Tous les disques,lemiroir etle pool fonctionnentparfaitement(ONLINE). Aucun contrle dtat nest en cours (scrub:none requested). Les0 correspondentauLecture (READ) / criture (WRITE) ralises sur chaque disqu-es par seconde. Pour linstant, il ne se passe donc pas grandchose.Pourinformation,c0t0d0s0 faitrfren-celapremirepartition s0 dupremierdisqued0 dela premire nappe t0 du premier contrleur c0.Cration dun pool de donnesVousallezmaintenantcrerunpooldedisques destin accueillir vos donnes que lon nommera da-ta.Commelamachinedetestpossdedeuxdisques de 500 Go chacun, vous allez crer un pool permettant dexploiter cet espace en volume et en redondance. No-us allons configurer ce pool en raidz. Pour cela, vous utilisez la commande suivante : sudo zpool create data raidz c1t0d0 c1t1d0c1t2d0 c1t3d0 c1t4d0 c1t5d0 c1t6d0 c1t7d0c1t8d0 c1t9d0 c1t10d0 c1t11d0Aprs quelques secondes seulement, le pool est dispo-nible. On sassure que le pool est bien fonctionnel avec la commande ci-dessous :sudo zpool status data pool: syspool state: ONLINE scrub: none requested cong:NAMESTATEREADWRITE CHKSUMdata ONLINE 000mirror ONLINE 000c0t0d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000c0t1d0s0ONLINE 000Figure 14: Validation avant cration de l'utilisateurubuntu . Figure 12: Confirmation avant validation du mot de passe derootFigure 13: Confirmation avant validation du mot de passe de ubuntuFigure 12. Conrmation avant validation du mot de passe deroot Figure 13. Conrmation avant validation du mot de passe de ubuntu Figure 14. Validation avant cration de lutilisateurubuntu .10/2010 14ProjetsFigure 19: Saisie de l'adresse IP de la baie. Figure 20: Choix de la configuration IPV6 Figure 21: Validation avant application des rglages rseau. Figure 22: Choix de configuration de la passerelle. Figure 16: Validation avant configuration des paramtres rseau du PC Figure 17: Confirmation du lancement de la procdure de configuration de la carte rseau Figure 18: Choix d'attribuer une adresse IP statique la carte rseau de la baie. Figure 16. Validation avant conguration des paramtres rseau du PCFigure 17. Conrmation du lancement de la procdure de conguration de la carte rseauFigure 18. Choix dattribuer une adresse IP statique la carte rseau de la baie.Figure 19. Saisie de ladresse IP de la baie.Figure 20. Choix de la conguration IPV6Figure 21. Validation avant application des rglages rseau.Figure 22. Choix de conguration de la passerelle.Figure 15: Dfinition du nom et du domaine du PC Figure 15. Dnition du nom et du domaine du PCNexentawww.phpsolmag.org 15Delammefaonqueprcdemment,oncontrlela capacit avec la commande :sudo zpool list NAMESIZE USED AVAIL CAP HEATH ALTROOT data 5.44T 3.21M 5.44T0% ONLINE -Vous allez ensuite rgler le pool afin quil rpare auto-matiquement les problmes quil pourra dtecter. Pour cela, on utilise la commande :sudo set zpool set autoreplace = on dataautoreplaceestunedesnombreusesoptions disponibles pour un pool .. Si vous souhaitez faire ap-paratre la totalit des options disponibles et les valeurs associes, tapez la commande : sudo sudo zpool get all dataSi vous souhaitez demander un contrle manuel de ltat des disques, utilisez loption scrub avec la com-mande zpool :sudo zpool scrub dataLa commande zpool status data vous permettra de suivre ltat delopration.Vous pouvez rappeler lhistorique de toutes les com-mandes ralises sur un pool avec la commande : sudo zpool history dataEnfin, loption iostat vous permettra de suivre lutilisation de votre pool en nombre de lecture/criture et le taux de transfert par disques :sudo zpool iostat -v dataAjoutez-s1pourrafrachirlaffichagechaquesec-onde.Accrotre la taille dun disqueSi lespace venait manquer, vous pouvez agrandir votre pool de disques sans perte dactivit. ZFS pro-pose la commande zpool add. Ainsi, pour ajouter les disques c0t12d0 et c0t13d0 monts en miroir data,tapez:zpool add datamirror c0t12d0 c0t13d0Cration de dataset au sein dun poolJusquprsent,vousavezfusionntouslesdisques dansundisquevirtueldetrsgrandecapacit.Ilvous resteorganisercetespace.Onnepeutpasrelle-ment parler de partitions o cela sentend avec dautres systmesdefichierssousLinuxouWindows.Ilsagit despaces dynamiques, ajustables volont et potentiel-lementlimitsuniquementparlatailledupool;lequel Figure 23: Saisie de la passerelle rseau Figure 24: Choix de la configuration d'un serveur de nom Figure 25: Saisie de l'adresse IP du serveur de nom DNS Figure 26: L'installation de NexentaCore est termine! Figure 23. Saisie de la passerelle rseauFigure 24. Choix de la conguration dun serveur de nomFigure 25. Saisie de ladresse IP du serveur de nom DNSFigure 26. Linstallation de NexentaCore est termine!10/2010 16Projetsest galement extensible. Ces espaces sont appels des datasets.Vous allez maintenant crer un premier dataset nom-m nfs-share dans le pool nomm datasudo zfs create data/nfs-shareLacommandezfs listaffichelintgralitdesparti-tions du disque virtuel. sudo zfs listNAMEUSED AVAIL REFER MOUNTPOINT data/nfs-share 5.44T 3.21M/data/nfs-shareVous noterez que le contenu du dataset est directement accessible depuis le point de montage /data/nfs-share.La capacit maximale du contenu de ce dataset est celle du pool data soit 5To.Gestion de la taille des partitionsLespartitionsZFSnesontpaslimitesentailleindi-viduellement.Cecisignifiequetouteslespartitions partagentlatotalitdudisque.Lespaceestallouen fonction des besoins. Toutefois, il peut tre ncessaire de limiter la taille dune partition. Pour cela, vous pouvez utiliser la commande zfs setquota.Danslexempleci-dessous,ledatadata/nfs-share sera limit une taille de 10 Go.zfs set quota=10G data/nfs-shareLa commande zfs get quota permet dafficher les quotas attribus une partition.zfs get quota data/nfs-shareInversement,ilpeuttreutilederserverunmini-mum despace pour une partition et ainsi sassurer que lespaceneviendrapasmanquerlejouroilsera utilis. Cette opration peut tre ralise avec la com-mande zfs set reservation. Dans lexemple ci-des-sous,lapartitiondata/nfs-sharesevoitrserver1Go sur le disque.zfs set reservation=1G data/nfs-shareTapez la commande zfs get all data/nfs-sharepour sassurer que les modifications ont bien t appli-ques (Listing 1).Au passage,vous noterez que la liste des options estassezlongue.Onytrouvenotammentloptionde compression des donnes en temps rel. ZFS supporte la compression native des datasets.Vouspouvezcommanderlacompressiondudatasetnfs-share avec la commande :sudo zfs set compression=on data/nfs-shareVouspourrezfacilementatteindreuntauxdecompres-sion de 1.4 sans dgradation notable des performances. dla star-link LINKCLASSMTUSTATEBRIDGEOVER bnxOphys 1500 up - Figure 27: Etat des cartes rseau Figure 28: Configuration de la carte rseau Figure 29: Listing des options duzpool Figure 28. Conguration de la carte rseauFigure 27. Etat des cartes rseauFigure 29. Listing des options duzpoolNexentawww.phpsolmag.org 17 Pour valider que le partage est bien actif et connatre son identifiant de partage, tapez la commande :sudo itadm list-targetFigure 32. cration dun partage ISCSIDepuisfindcembre2009,undatasetdispose galement dune option de dduplication de donnes en ligne. Contrairement la compression, la ddupli-cation factorise la rduction de volume en ne stockant quunefoisunblocdedonnedjprsentdansun dataset.Suppression dune partitionLasuppressiondudatasetnfs-sharedupoolnomm data est aussi simple que :sudo zpool destroy data/nfs-sharePartage dun dataset en NFSSivoussouhaitezpartagertoutlecontenududatasetnfs-share au travers du protocole NFS, il vous suffira de tapez la commande :sudo zfs set sharenfs=anon=0 data/nfs-shareLasquencesharenfs=anon=0nousaffranchideto-ut problme de lecture/criture sur le partage li des droitsdutilisationdudataset.Sivousaviezsaisi sharenfs=on,uneauthentificationavecuncompteuti-lisateurNexentaCorevalideseraitrequispourcrire dans le dataset. Si votre baie dispose de plusieurs car-tesrseau,lepartageestdisponibledepuischacune des adresses IP. Vous pouvez quilibrer la charge entre les deux cartes rseauxconfigurant vos serveurs po-ur quils sadressent la baie au travers des multiples cartes.Partage dun dataset en iSCSISi vous souhaitez partager un dataset au travers du pro-tocole ISCSI11, sa taille doit imprativement tre fige. Il faut simaginer que le dataset est en ralit un fichier stock dans le pool et que cest le contenu de ce fichier qui est prsent au rseau au travers de ISCSI.La cration dun dataset de 1To seffectue avec la com-mande suivante :sudo zfs create -V 1T data/iscsi-shareOn partage ensuite ce dataset avec la commande :sudo zfs set shareiscsi=on data/iscsi-shareIl faut bien avoir en tte que si ZFS ne connat pas de li-mitations pratiques pour la taille des pool et des datasets,ce nest pas le cas des autres systmes dexploitation. Aussi, dans la pratique, il est inutile dexporter un data-set de plus de 2To car il ne pourra pas tre exploit par dautres systmes que Solaris.11 http://fr.wikipedia.org/wiki/Internet_Small_Computer_System_InterfaceFigure 30: Analyse de l'usage des disques en temps rel Figure 31: Usage d'un pool en temps rel Figure 32: cration d'un partage ISCSI Figure 30. Analyse de lusage des disques en temps relFigure 31. Usage dun pool en temps rel10/2010 18ProjetsSivotrebaiedisposedeplusieurscartesrseau,le partageestdisponibledepuischacunedesadresses IP.Vouspouvezquilibrerlachargeentrelesdeux cartesrseauxconfigurantvosserveurspourquils sadressent la baie au travers des multiples cartes.Configurer Vmware ESXi pour utiliser NexentaCoreMaintenant que NexentaCore est fonctionnel et quil ex-porte vos disques vers le rseau au travers des proto-coles NFS et iSCSI, il reste configurer Vmware ESXi afin dutiliser ces espaces de stockage distants.La configuration des datastore est ralise depuis le menu configuration.Cration dun datastore NFSLa cration dun datastore NFS est extrmement simple. Depuis linterface dadministration de Vmware ESXi, cli-quez sur loption storage dans le menu de gauche puis cliquez sur le lien add storage en haut droite. Un assi-stant va sous guider dans la cration du datastore. Cho-isissez tout dabord lassistant pour un network file Sy-stem. Cliquez sur le bouton NEXT.Vous devez saisir ladresse IP(192.168.1.38) de vo-treNexentaCoredanslechampserveretnomdevo-trepartageNFS(data/nfs-share)danslechampfolder.Nommezvotredatastoredanslechampdatastorena-me. Cliquez ensuite sur next. Votre datastore est prt et fonctionnel.Il ne vous reste plus qu cliquer sur le bouton finish.Dsormais, lorsque vous crerez une machine virtuelle, ilvousseraproposdentreposercesdisquesvirtuelsdansledatastoredistantNFSdatastore.Lerestede lutilisation de ESXI est totalement inchange.Cration dun datastore iSCSILacrationdundatastoreISCSIestlgrementplus complexe car elle require deux tapes : l'tablissementd'unlienentreESXietleserveur ISCSI (c'est dire NexentaCore), la cration du datastore proprement parler.Lapremiretapeestaccessibledepuislemenude droitenommstorageadapters.Slectionnezensuite la ligne en dessous de iscsi storage adapters. Cliquez Listing 1.NAME PROPERTY VALUE SOURCEdata/nfs-sharetypelesystem -data/nfs-share creation ven mai 15 12:44 2009 -data/nfs-share used 24,0K -data/nfs-share available 10,0G -data/nfs-share referenced 24,0K -data/nfs-share compressratio 1.00x -data/nfs-share mounted no -data/nfs-share quota 10G localdata/nfs-share reservation 1G localdata/nfs-share recordsize 128K defaultdata/nfs-share mountpoint /data/nfs-share localdata/nfs-share sharenfs off defaultdata/nfs-share checksum on defaultdata/nfs-share compression off defaultdata/nfs-share atime on defaultdata/nfs-share devices on defaultdata/nfs-share exec on defaultdata/nfs-share setuid on defaultdata/nfs-share readonly off defaultdata/nfs-share zoned off defaultdata/nfs-share snapdir hidden defaultdata/nfs-shareaclmode groupmaskdefaultdata/nfs-share aclinherit restricted defaultdata/nfs-share canmount on defaultdata/nfs-share shareiscsi off defaultdata/nfs-share xattr on defaultdata/nfs-share copies 1 defaultdata/nfs-share version 3 -data/nfs-share utf8only off -data/nfs-share normalization none -data/nfs-share casesensitivity sensitive -data/nfs-share vscan off defaultdata/nfs-share nbmand off defaultdata/nfs-share sharesmb off defaultdata/nfs-share refquota none defaultdata/nfs-share refreservation none defaultdata/nfs-share primarycache all defaultdata/nfs-share secondarycache all defaultdata/nfs-share usedbysnapshots 0 -data/nfs-share usedbydataset 24,0K -data/nfs-share usedbychildren 0 -data/nfs-share usedbyrefreservation 0Nexentawww.phpsolmag.org 19OLIVIER OLEJNICZAKResponsable informatique de lditeur logiciel silog.fr.Cofondateur du blog www.synergeek.Fr.Membre de Calvix.org.enfin sur le lien properties en haut droite de la zone details. Assurez-vousqueleprotocoleISCSIestbien activsurvotreserveurESXiencliquantsurlonglet gnral. Dans longlet dynamic discovery du formulaire de paramtrage du client ISCSI de ESXi, cliquez sur le bouton add.Indiquez dans la zone ISCSI server, ladresse IP du serveur NexentaCore (192.168.1.38). Fermez cet assistant. ESXi va vous proposer de par-courirtouslesserveursISCSIdfinisafindedtecter les disques disponibles. Acceptez mais sachez que cet-te tape ncessaire peut prendre plusieurs minutes.Retournerdanslemenudroitstorageetrelancer lassistantdecrationdedatastoreencliquantsurle lien add storage en haut droite.Cette fois ci, choisissiez loption disk/lun.Lassistantvavousproposerlalistedesdisquesd-tectssurloprationderescanmentionneplushaut dans cet article. Slectionnez le disque que vous sou-haitez utiliser comme datastore. Le champ san identifierse termine par le nom de lextend utilis dans Nexenta-Core (commande = sudo itadm list-target). Ltape suivante vous rappelle que le disque est vierge et quil vatreformat.Saisissezlenomquevoussouhaitez donner ce datastore. Les paramtres du formatage du disque doiventtre ajusts en fonction de la taille ma-ximale du disque de machine virtuelle qui y sera dpo-s. Cliquez sur next. Le datastore ISCSI est dsormais oprationnel.Il ne vous reste plus qu cliquer sur le bouton finish.Dsormais, lorsque vous crerez une machine virtuelle, il vous sera propos dentreposer ces disques virtuellesdansledatastoredistantNFSdatastore.Lerestede lutilisation de ESXI est totalement inchang.Si vous souhaitez crer dun datastore de plus de 2To,ilfautsuffitdecrerplusieursdatasetsparta-gs en ISCSI sur NexentaCore puis de les fusionner encliquantdanslazoneextentsdisponibleavecun clicsurleboutondroitdelasourissurledatastoreISCSI.Lexprience montre que les accs un disque vir-tuelstockdansundatastoreiSCSIsont510fo-isplusrapidequepourundatastoreNFS,surtouten charge. Toutefois, cette mesure dpend grandement de lutilisation qui est faite de la machine virtuelle.ConclusionAu terme de cet article, vous disposez dsormais dun baie de stockage de trs haute performance mue par ladistributionNexentaCoreetporteparlesystme de fichier ZFS. Le choix entre OpenSolaris ou Nexen-taCore est purement pratique car NexentaCore permet lutilisateur de Ubuntu de retrouver une ligne de com-mande familire. Les puristes prfreront srement la version SUN OpenSolaris, gage de compatibilit et de rapidit de rplication des correctifs.DetrsnombreuxaspectsrelatifslOS(Haute disponibilitdescartesrseau,synchronisationentre baies...)etZFS(snapshot,clones,backup,disques de secours, rparation de pools.....) nont pas t abor-d dans le cadre de cet article mais devront tre mis en uvre avant la mise en exploitation dune telle baie de stockage.Figure 36: Recherche de partages ISCSI sur le rseau Figure 33. Choisir entre la cration dun datastore NFS ou iSCSIFigure 34. Ajout dun datastoreNFSFigure 36. Recherche de partages ISCSI sur le rseau10/2010 20DossierAJAX en tant que rponse une problmatique. Description de l'volution du web des annes 1990 2005LeWebdanslesannessombresde1990prsen-taitdespagesHTMLstatiques.Laplupartdespages taient du texte mises en forme grand renfort de bali-ses HTML , et nous tions fascins par les liens hyper-textes. Certains fous du design y ajoutaient des images etquelqueseffetsvisuels,aussittnousdsactivions toutcelapourlaisserrespirernosmodemsasthmati-ques.En quelques annes, la tendance porter la charge sur le poste client en applications diverses s'accentua, il fallait alors allger le plus possible la communication Web,auvuedel'expansiondurseauInternet.Les technologiesdescriptctclientdontcertainespro-pritaires aux navigateurs, des solutions base de plu-ginsfurentflorsetl'ignorancedesrecommandations duW3Calourdirentconsidrablementlatchedud-veloppeur.Autoutdbutdusicle,labaissedescotsdes serveurs,l'amliorationdesdbitsetdesinfrastruc-turesontfavorisletransfertdestraitementsdyna-miquesdespagesversleserveurWeb.Ledvelop-pementdetechnologiesserveursetdeslangages serveurs taient assurs. En revanche, la charge aug-mentactserveuretengorgealerseau.Dansce westernsauvage,surgitJesseJamesGarett,auteur d'un article et d'un compromis sur la relation client-ser-veur. Prsentation de l'article fondateur Ajax de Jesse James Garrett du 18 fvrier 2005Jesse James Garrett a l'ide de runir sous un acrony-me AJAX un ensemble de technologies qui font le Web de son poque. Mais c'estun peu plus que cela, il com-prend qu'il ne faut pas interrompre l'utilisation de la pa-ge Web par des requtes au serveur, qui entranent un gel de la page et nuisent son utilisation . Il faut faire circuler sur le rseaule strict ncessaire d'information pourlademandedelapageduclientetentchede fond, Magister dixit (Le matre l'a dit ). Un langage ser-vira de glu l'ensemble des technologies avec la pos-sibilit de communiquer en asynchrone : the winner is JavaScript.Dfinition du RIA (Rich Internet Application)Aujourd'hui,l'utilisateurneconoitpas(etneveut pas) de diffrence entre une application en locale et surrseauweb,latechnologies'effacepourlais-serplaceuneexprienceutilisateurquisefoca-lisesurl'objetdesademandeetnonsurlafaon de l'adresser. L'utilisateur s'attend alors aux mmes fonctionnalits de part et d'autre, quelque soit le sup-port,l'environnementouletyped'informationsde-mands.Lewebdoittrecapabledefournirtoutes cesfonctionnalitssouhaitesavecuneractivit toujoursplusaccrue.L'ensembledestechnologies qui permettent ce paradigme rpond l'acronyme de RIA(RichInternet Application):applicationinternet riche.AJAXet PHP'Il n'y a pas au monde de pire malheur que la servitude.' Sophocle (extrait de Ajax). Dans cet article, nous apprendrons pourquoi et comment est n le conceptAjax, son utilisation avec PHP. Nous aborderons les avantages de la communication asynchrone et ses limites, les solutions apportes et sa mise en uvre. Cet article explique : Historique et description technique AJAX. Difrentes implmentations de AJAX. Communication entre AJAX et PHP. Mise au point avec Firebug.Ce qu'il faut savoir : Base de la communication HTTP. Bonne connaissance des fondements JavaScript. Bonne connaissance PHP 5.2. Notion du DOM et CSS.Ajax et PHPwww.phpsolmag.org 21auscriptclientetavecXMLHttpRequestseconnecte auserveur.L'utilisateurpeutpendantcetempsconti-nuer utiliser la page, par exemple, pour voir des arti-cles similaires en faisant dfiler une zone sur la mme page.Leserveurwebreoitlademande,interrogeune base de donnes, construit la rponse ncessaire uni-quement, ici dans une chane HTML contenant la des-cription.Leserveurrenvoielapartiequisatisfaitla demande,etlenavigateurl'affiche(HTMLetCSS). L'utilisateurn'ataucunmomentcontraintd'atten-dre cette rponse.VouspouvezexprimenterAjaxsurGoogle,vous verrez que la recherche s'effectue chaque vnement d'appuidetoucheetlalistes'enrichittrsrapidement au fur et mesure des lettres successives en donnant cet aspect de fluidit.numration de techniques alternatives sans AjaxD'autrestechniquesalternativesexistentetpeuvent sauver la mise lors de spcifications bien particulires. On peut citer :Les applications Java pour le web : les applets (sur le client) et servlets (sur le serveur), Flex - Flash player et son plugin,Cadre cach avec l'utilisation de iframe, elle fait of-ce de cache et une fois prterenvoie la partie uti -le la page cliente.Description technique deAJAXRappel (AJAX = Asynchronous JavaScript+CSS+DOM+XMLHttpRequest). Jesse James Garrett dfinit AJAX comme un ensemble de technologies et donne un ca-dre de dveloppement base de standard, ou plutt de recommandations selon la terminologie W3C. En nu-mrant les diffrentes couches, on dfinit la sparation entrelaprsentationdesdonnesetleursinterroga-tions,cequin'estpassansrappelerlemodleMVC (Modle Vue Contrleur). LaprsentationestassureparHTML/XHTML et CSSetsastructuredynamiquereposesurle DOM (Document Object Model),LamanipulationdesdonnesparXSLTetl'chan-ge par XML (et plus),L'orchestration est contrle par JavaScript utilisant son objet ftiche XMLHttpRequest.Description de l'acronyme AJAX en approfondissant l'asynchrone et le X AsynchronousJavaScript+CSS+DOM+XMLHttpRequest, on prend le dbut et la fin, on obtient un nom un peu marketing AJAX. C'est vendu ! En dtail, regardons la diffrence entre une communication synchrone et asyn-chrone.Premier cas de figure le modle classique synchroneL'utilisateur partir de la page web fait une demande HTTPsurleserveur,parexemple,ilveutconnatre la description de l'article qu'il dsire acheter. La page segleetattendlarponseduserveur.Leserveur webreoitlademande,interrogeunebasededon-nes, refait entirement la page d'achat du client. Le serveurrenvoielatotalitdelapageaunavigateur qui l'affiche (HTML et CSS). La page se rafraichit en clignotant,cequiindiquelerechargemententierde la page.L'utilisateur peut nouveau naviguer.Deuxime cas de figure le modle Ajax asynchroneL'utilisateurpartirdelapagewebfaitunedemande HTTP sur le serveur,il veut toujours connatre la des-criptiondel'article.Eninterne,lenavigateurfaitappel Figure 1. Communication synchrone et asynchroneFigure 2. Google et sa compltion automatique10/2010 22DossierComment l'implmenter, prsentation de la classe XMLHttpRequestet ActiveXObject pour MicrosoftDepuislongtempslesnavigateurs,audbutl'Internet ExplorerdeMicrosoft,peuventfairedel'asynchrone. Cetobjetexistesousdeuxentitsdiffrentes:unAc-tiveX pour Microsoft nomm ActiveXObject et XMLHtt-pRequestpourlesautres.Microsoftadclinsonob-jet sous deux formespour la version suprieure 5.0 etInternet Explorer 5.0. Nous allons crire le code pour faire le choix et la dtection notre place. Code choix de l'objet : criture du createXHR() l'appel se fera sim-plement par : var objetXHR = createXHR() ;Tableau des attributs et mthodesUn objet, c'est un ensemble d'attributs (tats) et de m-thodes (comportements). Notion de callback : par mthode de callback, nousappellerons une fonction qui observera en tche de fond le changement d'un tat donn et excutera la fonction passe en paramtre.Valeurs de readyStateUn exemple simpleL'exemples'critenJavaScript,ilpeuts'appelerau chargement de la page ct client.On utilise la mthode de cration de l'objet createXHR()implmente prcdemment.Les conditions de l'appel sont les suivantes : appel par la mthode GET,un script reponseScript.php (le script est cens blo-querl'interactionutilisateursurleposteclient)re-tourne un texte,La communication client-serveur est asynchrone.Ce script ne prend pas de paramtre pour la mthode GETOn instancie l'objet XMLHttpRequestvar objXHR = createXHR() ;That's all folks!Pourrestersimple,nousnefaisonspasintervenirle DOM, ni CSS, ce qui ne correspond pas stricto sensu la dfinitiond' AJAX. Al'aidedecescriptconcis,onpeut serendrecomptequel'inscriptiond'unerequteAJAX relve d'une mthodologie et d'un ordonnancement pr-cis. Cette mthodologie est suivre chaque fois, selon l'orientation que nous voulons donner notre requte. En d'autres termes, le traitement des erreurs et des tats de l'instance XMLHttpRequest peut tre assez vari.Aprsl'excutionde send(),onpeutafficherles en-ttes de rponses HTTP. Par exemple :client.onreadystatechange = function() { if(this.readyState == 2)print(this.getAllResponseHeaders()); }Listing 1.Choix de l'objet XHRfunction createXHR() {var xmlHttpReq = null;if(window.XMLHttpRequest){ //IE7 et plus, Firefox,Safari, Opera....var xmlHttpReq = new XMLHttpRequest();return xmlHttpReq;} else if (window.ActiveXObject) { //on part au paysde Microsofttry {return new ActiveXObject("Msxml2.XMLHTTP");//Internet Explorer version > 5.0} catch (err) {}try {return new ActiveXObject("Microsoft.XMLHTTP");// Internet Explorer version 5.0 !} catch (err) {}}throw new Error("Impossible de crer l'objet"+"XMLHttpRequest pour le navigateur.");}Listing 2. Le moteur AJAX// on implmente le callback comme fonction anonymeobjXHR.onreadystatechange = function() {// on test les ags readyState (4 : complete) etstatus (200 : OK du HTTP)if(this.readyState == 4 && this.status == 200 ){//Si c'est une rponse texteif(this.responseText != null ) {//On rcupre la valeur et on l'afchevar resultText = this.responseText ;alert( resultText) ;} else return ;}}Listing 3. Les appels de fonctionnalits //Appel du script PHP avec une mthode GET sansparamtre.objXHR.open("GET", "reponseScript.php", true) ;//On envoie la requteobjXHR.send(null) ;Listing 4. Le script reponseScript.php

Listing 4B.Manipulation du DOMinnerHTMLContent(id, newContent) {var elt = document.getElementById(id) ;if(elt != null) {while(elt.rstChild) {elt.removeChild(elt.rstChild) ;}var inner = document.createTextNode(newContent) ;elt.appendChild(inner) ;}}Listing 5.Chargement startAjax

window.onload = function() {startAjax ; // autres scripts charger}

Ajax et PHPwww.phpsolmag.org 2310/2010 24DossierTableau 1. Liste des mthodes et attributs Mthode et attribut Paramtre et descriptionopen(method, url, async)Ouvre une connexion l 'URLdu script ct serveurmethod = HTTP(GET, POST, etc.) url = url ouvrir,peut inclure une chane de requte async = prcise si la connexion doit tre asynchrone (true) ou bien synchrone (false) onreadystatechangeAfecte une fonction objet comme callback (syntaxe identique l'afectation du modle vnement du navigateur)setRequestHeader (name,value)Ajoute un header la requte HTTP pour prciser la nature du corps de la requte passe par send() en cas de POSTsend(body)Envoi de la requte body = null pour GET, une chane pour POSTabort()arrte leXHR qui coute la rponsereadyStatetat du cycle de vie de la rponse (renseign aprs que send() soit appele)StatusCode de retour de HTTP (un entier) responseTextCorps de la rponse du serveur sous forme de texteresponseXMLCorps de la rponse du serveur sous forme XMLgetResponseHeader (name)Lecture de la rponse de l'en-tte prcis par son nomgetAllResponseHeaders()Retour de tous les en-ttes HTTP dans une seule chaneTableau 2. Liste des valeurs readyStatetatValeurDescription0 UninitializedLa requte n'est pas encore envoye (open()non appele)1 LoadingInitialise mais la rponse n'est pas arrive car la mthode send() n'a pas t excute2 LoadedLes en-ttes de rponse peuvent tre lus, send() a t excute 3 InteractiveLa rponse est en cours de rception, elle est incomplte, mais elle peut tre lue.4 CompleteLa rponse du serveur est complte. La proprit responseText ou responseXML con-tient le rsultat en fonction du type de donnes.Onpeutdsirerunepolitiquedegranularitdesex-ceptionssurlesparamtresenlectureseulecomme readyStateetstatus,pourlestraiterdefaondiff-rencie. Pour status, les codes de retour HTTPaver-tissent l'utilisateur ou le script du problme : 200OK, 404 page not found, 403 forbidden, par exemple. Une liste exhaustive des codes de retour se trouve sur le site Internet du W3C.Restrictions et solutionsTout n'est pas merveilleux dans le monde AJAX. La pre-mire condition sera que la requte s'effectue sur le m-meserveur,restrictionquinetarderapastomberau regarddelanouvelleimplmentationdeXMLHttpRe-quest 2. Les frameworks JavaScript proposent dj des solutions quasi-automatiques. Il existe plusieurs mtho-des alternatives, certaines sont cites succinctement ci-aprs.Schma serveur diffrent : mthode proxy le ser-veurpeutinterrogerunautreserveur,iln'yapasde restriction.Mthode base de iframe :On utilise une balise que l'on rend in-visible grce ses proprits CSS. L'intrt est que l' ifra-me ne souffre pas de la restriction de l'interrogation d'un service sur un serveur diffrent du serveur hbergeur. Mthode cross domain :Microsoft avec XDomainRequestet XMLHttpRequest 2propose en plus de la simplification de syntaxe le cross domain,ilsuffit d'indiquerdansl'URL,ledomainedis-tantatteindre:parexempleobjXHR.open("GET","http://www.domainservicedistant.net/script.php", true);Le protocole HTTP Le protocole HTTP permet un transfert de fichiers. Ce qui importe, c'est l'criture de l'URL et l'criture d'en-t-te. Il est dfini par une RFC, la rfc2616 pour le protocole HTTP/1.1du W3C.Une URL get avec ses paramtres visibles :http://:/lescript.php?param1=valeur1&param2=valeur2HOST c'est l'adresse de l'hte de la ressource attein-dre.PORT est par dfaut gal 80, il peut tre omis.Ajax et PHPwww.phpsolmag.org 25Les en-ttes HTTPLes en-ttes (headers),nous serons intresss essen-tiellement par : Content-Type : par exemple text/xml,pour prciser quel type de donnes est envoy, Cache-Control : contrle du cache, pour le dsacti-ver le cache vaut no-cache pour HTTP 1.1, Pragma : pour le dsactiver le cache vaut no-cache pour HTTP 1.0.RappelsGET/HEAD/POST GETC'est une mthode pour demander une ressource URL. Les paramtres, s'ils existent, sont passs dans l'URL et sont donc visibles, HEADC'est une demande d'information de la ressource elle-mme, POSTSoumission de formulaire, les paramtres ne sont pas visibles dans l'URL.PHP et AJAX. Pas de communication PHPavec JavaScriptIl est souvent question pour les dbutants de vouloir fai-re communiquer ces scripts, par exemple, que JavaS-cript utilise une fonction PHP. Ce n'est pas possible! Le PHP s'excute sur le serveur, le JavaScript ct client. Deplusl'instantn'estpaslemme,quandJavascript s'excute ct client le PHP 'n'existe plus', le serveur l'a renvoy sous forme HTML +Javascript. Et pourtant...PHP peut construire du JavaScript la vole, qui sera renvoy par le serveur, donc on peut dire qu'il y a rela-tion.Delammefaon,unformulaireHTMLconstruit par PHP peut ragir des vnements JavaScript. Javascriptpeutconstruireaussiunformulaire,le soumettre et faire une requte un script PHP, donc il y a aussi interaction. Mais ce sont des interactions in-directes, qui ncessitent des aller-retours entre le client et le serveur.1 le navigateur client demande au serveur une pa-ge php soit par lien HTML ou par JavaScript, 2 le serveur obtient la page,3 le serveur excute le php (qui peut crire ou mo-dier du texte JavaScript),4larponseamneunchierinterprtableparle navigateur (XHTML + JavaScript par exemple).Ce schma, plutt symbolique, permet de comprendre que JavaScript du client n'est jamais en relation directe avec le PHP du script php.Ajax appel 'script php' et interagit sur le DOM :Le DOM, permet de reconstituer le document sous formed'unarbreetdenuds.Onpeutajouter, modier,supprimerunnudouunensemblede nuds, ses attributs et valeurs,JavaScriptautoriselamanipulationdel'arbresyn-taxique du DOM.Introduction innerHTML et l'alternative JavaScript de manipulation du DOM La mthode la plus commune pour afficher un rsultat detypetextedansunebaliseHTMLavecJavaScript est innerHTML :pour une balise HTML avec un Id 'textAjax'Code JavaScript avec innerHTML :document.getElementById("textAjax").innerHTML= objXHR.responseText ;Cependant l'attribut innerHTML ne fait pas parti des sp-cifications du DOM. Toutefois, cet attribut est largement Figure 4. Schmas PHP sur serveur Javascript sur clientFigure 3. Mthode proxy10/2010 26Dossierdiffussurlesnavigateursrcents.Malgrtout,ilpeut tre judicieux d'crire correctement les choses...Manipulation des nuds DOMPour remplacer innerHTML, en pure manipulation du DOM, on crit la fonction du Listing 4B. L'appel devient donc : innerHTMLContent("textAjax" , objXHR.responseText);Il nous manque pour un AJAX complet,un traitement CSS. Dans le fichier client, on trouve le HTML suivant :. inclure dans un chier CSS part ou bien en dbut de script entre les tags

span.message { color: red ;font-size: bold ;}

Maintenant les textes des span qui ont une classe mes-sage seront en rouge et gras.Diffrents types d'envoisPour dclencher l' AJAX, nous avons besoin d'un v-nement. Dans la page une fois charge (voir Listing 5), on excute notre fonction startAjax(voir Listing 6).Sans paramtre,Onreprendlecodeprcdemmentcritetonmodifie l'appel alert() pour conserver le rsultat dans la page (voir Listing 6).Avec GET paramtr texte,Leproblmeavec AJAX,c'estlamiseencacheauto-matique de certains navigateurs. Pour viter cela, il faut un peu lui mentir, faire croire que notre requte est nou-velle chaque fois.Sinon, le navigateur renvoie son cache ! Commetoujoursenprogrammation,letempsva nous permettre d'obtenir un rsultat variable.Il suffit de passer ce paramtre par GET, aprs le point d'interrogation, on crit ces lignes avant l'appel open()(voir Listing 7).Avec POST paramtr texte.Avec POST, les paramtres de l'URL disparaissent, mais comme rien ne se perd mais tout se transforme, on d-finit les paramtres dans une variable :var param = "utilisateur=root&codePasSecret=1234" ;Listing 6. Le moteur AJAXfunction startAjax() {var objXHR = createXHR() ;objXHR.onreadystatechange =function() {if(this.readyState == 4&&this.status == 200 ){ if(this.responseText != null ) {var resultText = this.responseText ;document.getElementById("textAjax").innerHTML =resultText ;// la place de alert() } else return ;}}}L'appelobjXHR.open("GET", "script.php", true);objXHR.send(null) ;Listing 7. Appel du script GET

Listing 10. Renvoi de la page

Listing 11. objet JSON//javascript objet JSON{"nomObjet": {"attribut _ 1":"valeur _ 1","attribut _ 2":"valeur _ 2" }}Listing 12. Parse la rponsefunction parseResponse(objXHR){var jsonObj=eval("("+objXHR.responseText+")");var result1 = jsonObj.nomObjet .attribut _ 1;return (result1) ;}document.getElementById("result1").innerHTML =parseResponse(objXHR) ;Ajax et PHPwww.phpsolmag.org 27nousallonsavertirleserveurquenouspostons,donc on l'indique l' header (voir Listing 8).Le script php :Ilrcuprelesparamtresetenvoieuneapprcia-tion (voir Listing 9).Note : les headers donnent le type de la page ren-voy (text/plain) ainsi que la faon dont le cache est gr (ici no-cache). Dans la balise span textAjax du client le message 'root vous tes un idiot!' doit appara-tre en rouge et gras. Les exemples ci-dessus ont tous des paramtres d'envoi texte simple. Toutefois, les pa-ramtrestransmisauserveurpeuventtreauformat JSON,XML,fragmentduDOM(XML),etc.Cecimo-difieletypedeheaderenvoyeretajouteuntraite-ment de l'argument supplmentaire, mais la logique de l' AJAX reste la mme. PHP dans sa version suprieure 5.2 permet une approche simplifie de ces traitements grce aux fonctions json_* et simplexml_*. Dans tous les cas, on peut lire les donnes brutes (raw data) en-voyes parPOST par :

Diffrents types de format de donnes pour les rponsesL'objet XMLHttpRequest a deux proprits qui contien-nent les rponses : 1 responseText contient les donnes sous forme de chane texte, 2 responseXMLcontientlesdonnesenxmlvali-de.Danslecascontrairecontientnull,etleretour sera du texte dans responseText.Firefox supporte un attribut overrideMimeType, cri-re juste la suite de l'instanciation de XMLHttpRequest. Cecipermetd'informerlenavigateurquelesdonnes en retour auront un Content-Type: text/xml.if (objXHR.overrideMimeType) objXHR.overrideMimeType('text/xml') ;La mthodologie du script de rponse repose sur un or-dre prcis d'tapes respecter :1 Envoyer un header correspondant la nature de laressourceretourne.Sansaucuneinstruction de sortie le prcdant( pas de echo, balise html...), PHP vous le rappellera le cas chant,2RcuprationdesdonnesduPOSTouGET.Les variablesglobalesetmthodessuivantesseront vos amies : $ _ REQUEST, le _ get _ contents(), etc.,3Lesdonnesseronttraitessibesoin,pourna -lement correspondre au format de sortie voulu. Par Listing 13. Tableau PHP au format JSON

Listing 14. Rponse PHP au format XML

Listing 15. Rcupration en JavaScript au format XMLobjXHR.onreadystatechange = function() {if(this.readyState == 4 && this.status == 200 ){if(this.responseXML != null ) {var resultXML = this.responseXML ;var rootXML = resultXML.rstChild ; //racine dudocument xmlvar attribut _ 1 = rootXML.getElementsByTagName("attribut _ 1")[0].rstChild.nodeValue ;document.getElementById("textAjax").innerHTML =attribut _ 1 ;} else return ;}}Listing 16. ScriptProxy.php

Listing 17. Extrait d'un ux RSS

RSShttp://domain.net/index.htmtexte duux RSS

Listing 18. Traitement JavaScript du RSSobjXHR.onreadystatechange = function() {if(this.readyState == 4 && this.status == 200 ){if(this.responseXML != null ) {var resultXML = this.responseXML ;var lstItemRSS = resultXML.getElementsByTagName("item") ;for( i= 0 ; i < lstItemRSS.length ; i++){var title = lstItemRSS[i].getElementsByTagName("title")[0].rstChild.nodeValue ;var link = lstItemRSS[i].getElementsByTagName("link")[0].rstChild.nodeValue ;var out = title + " : " + link ;traite (out) ; //la fonction qui traitera lesdonnes pour afchage (manipulation du DOM )}} else return ;}}10/2010 28DossierexemplepourJSON,nousutiliseronslafonction json _ encode().4crituredelarponselasuiteduheader,par exemple .TexteJusqu'prsent,leserveurarenvoylesrponses sous forme de texte. Pour les scripts retournant ou trai-tantdutexte,ilseraitplusjudicieuxderecourirun script CGI enPerl. Exemple simple est prsent dans le Listing 10.JSONDfinitionsuccincte:JSONestdutexteauformatage convenu de donnes (nom/valeur) qui est extrmement faciled'emploipourJavaScript.JSONestlanotation objetdeJavaScript.Ilseprtel'valuation(eval)par JavaScript.JSONestsansdoutepluslgeretaussipo-lyvalent en terme de communication inter-application que XML. Exemple format JSON est montr dans le Listing 11.Lersultatretournestunechanedecaractres, elle sera dans l'attribut responseText.Oncritlafonctionpourtraiterlarponsedansla fonctiondecallbacklieonreadychange(voirLis-ting 12).Onremarquel'emploidelafonctioneval()pour retourner l'objet dcrit dans responseText.Avantages et inconvnientsLeformatJSONestunmoyensimpled'changerdes donnes tout en s'affranchissant du langage.Les spcifications JSON, sont prisent en compte par PHPgrce aux fonctions natives json_*.En revanche, en fonction de la version de PHP, on peuttreobligdepasserpardesbibliothquestier-ces,celles-cipeuventnepastredisponiblessurle serveur,oubienencore,leserveurn'autorisepasde sortie JSON. Format JSON PHP avec json_encode(),json_decode() et json_last_error()Soit un tableau array() PHP prsent dans le Lis-ting 13.$reponsecorrespondl'objetJSONdfinitpr-cdemment.Lafonctionrciproquejson_decode(),transformeunobjetJSONenuntableauPHP.On auraintrtvrifierqueleformatJSONestcorrect en testant la dernire valeur deretour de json_last_error().Parexemple,cettevrificationseferaavant echo de la rponse et juste aprs json_encode() :if (json_last_error() != JSON_ERROR_NONE )//traiter l'erreurreturn; else echo $reponse ;XMLDfinitionsuccincte:leformatXMLdevientunstan-dard de fait dans la plupart des changes de donnes. Ceformatbienquerigoureuxetverbeux,restelisible l'humainetpermetdehirarchiserlesdonnespar-foisissuesdesystmecomplexe.Deplus,rienn'em-pche de convertir ensuite les donnes XML en JSON, dans ce cas il faudra rcuprer le XML sous format tex-te dans responseText. Exemple, la rponse du serveur estprsentdansleListing14.Onrcupredansla fonction de callback la rponse XML (voir Listing 15).Avantages et inconvnientsOn remarque que le code peut devenir vite touffu, mais il peut se factoriser dans une boucle, ou bien tre d-plac dans une fonction ddie. Il existe aussi, des so-lutions avec des frameworks qui pourront allger l'cri-ture. Le traitement ncessite de connatre parfaitement la structure du fichier xml reu. Dans le cas contraire, il faut rendre un peu plus abstrait ou gnrique le code au risque de le rendre moins comprhensible.par exemple :var attribut _ 1 =rootXML.getElementsByTagName("attribut _ 1")[0].rstChild.nodeValue ; peut tre remplac par son quivalent :var attribut _ 1 = rootXML.childNodes[0].rstChild.nodeValue ; On note la disparition explicite du nom de l'attribut.RSS exemple d'application XML Dfinitionsuccincte : RSS (RDF Site Summary) est un fichierdesyndicationsousformatxmletquicontient desinformationscomplmentairesdedescriptionsde lasource.Nousavonsdeuxparties,lesmtadonnes (descriptionduchannel)etlecontenu(l'infoquinous intresse).Comme le flux RSS ne se trouve pas sur le mme serveur en gnral, nous allons utiliser le script appel surleserveurcommeproxy.ExemplescriptProxy.phpsurleserveur(appelparopen())(voirLis-ting 16).L'appel se fait comme une fonction GET :objXHR.open('GET', 'http://www.domainservice.net/scriptProxy.php', true) ; objXHR.send(null) ;LefluxRSScomprendunesuccessiond'informa-tions sur le modle en extrait du Listing 17.LarponseesttraiteenXML:resultXML.getElementsByTagName("item");retourneunelistedes items du flux (voir Listing 18).Exemple completUn exemple d'agenda simple. On utilise la base de don-nes SQLite, qui peut servir de SGBD intermdiaire, el-Ajax et PHPwww.phpsolmag.org 29Listing 19. Exemple complet AJAX Fichier index _ xhr.phpgetMessage() ) ;}if (isset($ _ GET['nom']) && trim($ _ GET['nom'])!="" ) {$nom = strtoupper( $ _ GET['nom']) ;$sql = "SELECT * FROM client WHERE nom LIKE :nom ORDER BY nom " ;$sth = $dbh->prepare($sql, array(PDO::ATTR _CURSOR => PDO::CURSOR _ FWDONLY) );$sth->execute(array(':nom' => $nom));$XML = new XMLWriter();$XML->openMemory();while($row = $sth->fetchObject() ){$XML->startElement("client");$XML->writeElement("nom",$row->nom);$XML->writeElement("prenom",$row->prenom);$XML->writeElement("telephone", $row->tel);$XML->endElement();}echo $XML->outputMemory();}else echo 'Demande impossible.';$dbh = NULL ;?>Listing 20. Mise en place de AJAX avec JQuery$("#success").load("script.php",{ 'nom[]': ["Adam", "Eve"]}, function(response, status, xhr) {if (status = = "success") {var msg = "resultat OK !";$("#result").html(msg);}});//JQuery laisse la possibilit d'une programmation complte d' AJAX .$.ajax({type: POST",url: "script.php",data: "prenom=John&nom=Resing",success: function(msg){$("#result").html(msg);}});10/2010 30Dossierle est trs lgre et elle est constitue d'un seul fichier. SonaccssefaitparPDOetnouspermetderevoir la requte paramtre. On suppose que la liste drou-lante des noms clients est alimente par une demande SQL de PHP. Quand le nom est slectionn, la requte AJAX appelle un script php qui retourne en XML le nom, prnom et numro de tlphone du client.La demande XMLHttpRequest se fait par une requte GETet les paramtres sont passs par URL. La rpon-se est XML en utilisant les fonctions de XMLWriter().Le Javascript dcode le XML par le DOM. La table client est cre par: CREATE TABLE "client" ("id" INTEGER PRIMARYKEY NOT NULL , "prenom" VARCHAR, "nom"VARCHAR, "tel" VARCHAR)On peut utiliserle plugin SQLite Manager pour Firefox pourconstruireetalimenterlabasepourlestests.La base est constitue d'un seul fichier que l'on placera de faon pouvoir tre accd parPHP.Mise au point et analyse dans Firefox avec Firebug 1.5.4Firefox est un formidable outil de dbogage. Il possde plusieurs plugins, dont certains trs performants : 'Web developper' , 'Firebug' et IETab 2 pour muler Internet ExplorerdansFirefox3.6.OngletConsolepourvoir Header et Response de la page avec Firebug. Firebugpossde un onglet en-ttes qui permet de visualiser les en-ttes de rponse et de requte. Il est intressant de noter le Content-Type du type de donne accepte par la requte et de voir videmment que XMLHttpRequest a fonctionn.Utilisation l'onglet DOM pour observer le comporte-ment de l'objetXHROnretrouvetousnosamisdeAJAX,unobjet objetXHRquiinstancieXMLHttpRequest,puislesdif-frents tats et rponses : readyState=4 du traitement termin, la responseText et son contenu, responseXML null, le status 200 du serveur avec le texte OK. Il est videntquecettefonctionnalitesttrspratique,sur-toutpourvisualiserleserreursettatsderessources demandes.L'ongletrseau(voirFigure7)permetd'obtenirle statut de la requte (ici GET) avec 200 OK, son temps d'excution(2,13s)etsesparamtresmoisetno-ca-che. En plus la slection par le bouton XHR trie les ap-pels AJAX uniquement!Profilage pour les temps d'accs et nombres d'appel des mthodesOn peutavoirunprofilageplusprcisencore,avecle boutonconsoleetprofiler(voirFigure8).Onpeutlire quelafonctioncallback actualiserPagetappele 5 fois.Examen des CSSPourfinaliserl'examenAJAX,lastructuredudocu-ment ainsi que son CSS peut tre value et modifie in-situ. L'tat des choses ne sera pas persistant sur le serveur, c'est uniquement sur le navigateur ! On peut obtenir le script CSS en cours avec l'onglet CSS, (voir Figure9),nousavonslesongletsCSS,stylecalcul (c'est--direaprslecascading).Lespropritssont ditables et l'on peut observer l'effet des modifications sur la page.Note :A partir du JavaScript, on peutcrire des lignes d'in-formation ou de dbogage dans la console :console.log("debogage: %s!", erreur1);Figure 5. Lecture des en ttes sur clientFigure 6. Observation de objetXHRAjax et PHPwww.phpsolmag.org 31L'objetconsolesupported'autresfonctionspuissantes commelesassertionsavecconsole.assert().L'on-gletscriptpermetd'intervenirsurleJavaScriptavec des points d'arrt et des valeurs suivre appeles Es-pions.Lavaleur'Espions'recherchededocument.getElementById("pdate") donne en bleu input#pdate(voir Figure 10).Cen'estqu'unmaigreaperudeFirebug,quiest une aide indispensable au dveloppement.Un framework JavaScript : implmentation avec Jquery. Prsentation et avantages d'utiliser un framework JavascriptUn framework offre un cadre de travail scuris et per-metdefaonmthodique,des'abstrairedecertaines contraintes rcurrentes de programmation. Cela favorise la concentration sur les parties rellement fonctionnelles du code et facilite la maintenance de ce dernier. Un fra-meworkpermetgnralementunecritureplusconci-se du code dans un cadre dtermin en apportant des fonctionnalitssupplmentairesquisimplifientlatche du dveloppeur. Toutefois, il est important de connatre la faon de coder sans le framework, from scratch avec JavaScript, car cela permet d'une part, de maitriser les techniquesmisesenjeu,etd'autrespartderemdier des bugs, des dfaillances et limites du framework.Parmi les problmes rencontrs, un framework peut rsoudre : L'implmentationdel'objetXMLHttpRequestdans lesdiffrentsnavigateursquin'estpashomogne. Nousavonsvulesdiffrentsobjetsinstancierpour Firefox et Internet Explorer Microsoft qui sont XMLHtt-pRequestetActiveXObject.Lecodeestsouventre-dondantpourl'explorationduDOM,parexemplede nombreusebouclessontncessairespourexplorer l'arbre DOM.Exemple de la simplification Parmi les mthodes remarquables de JQuery :.load( url, [ data ], [ complete(responseText,textStatus, XMLHttpRequest) ] )Cette mthode va grer seule l'envoi par POST ou GETen se basant sur le format du data. Si le data est un ob-jet, alors la mthode sera POST sinon GET.Exemple ://En xHTML

Le script va tre appel de faon asynchrone, ce pas-sage de paramtres oblige un POST, il n'y a pas de fonc-tion de callback.//javascript$("#result").load("script.php",{'nom[]': ["Adam", "Eve"] } );Le script va tre appel de faon asynchrone, ce pas-sage de paramtres oblige un POST, la fonction de call-back est appele en fin de traitement et affiche le suc-cs de l'appel AJAX.Figure 7. Visualisation du statut et paramtres de l'URLFigure 8. Utilisation du Proler10/2010 32DossierCe qu'il ne faut pas faire et pourquoiLestechniquesaperuessontsduisantesetpeuvent peu de frais booster l'interactivit d'un site. Malgr ses atouts, AJAX n'est pas la panace, il est mme contre-indiqu dans certains cas de figure. Ne pas utiliser l'asynchroneLesappelsasynchronessontfacilementralisables et l'on peut mme 'oublier' que l'on appelle un script de cette faon. La fonction .load de JQuerypeut avoir cet inconvnient.Ilpeuttrencessairedesynchroniser des scripts, la contrainte existe lorsque ceux-ci doivent tre excuts dans un ordre prcis. C'est le cas lorsque un script dpend du rsultat d'un autre, ou lorsque des accs une ressource sont critiques etdoivent tre ver-rouilles.Lefaitqu'unemthodedecallbackestmise en place, peut laisser dans l'ignorance l'utilisateur sur le rsultat de la rponse. Au cas o la rponse tarde, l'uti-lisateur peut continuer agir etmodifier son environne-ment et le retour du script appel ne pourrait plus tre en adquation avec l'tat de la page l'instant zro.Ne pas utiliser AjaxOn peutnepastreamenutiliser AJAX, silesna-vigateurssonttropvieuxetnesupportentpasunJa-vaScriptrcentafortioriXMLHttpRequest.Unutilisa-teurpeutavoirdsactivsoninterprteurJavaScript. Casunpeuplusrare,lesnavigateursenmodetexte pourraientavoirquelquesdifficultsaveclamodifica-tion du DOM...Des problmes de navigabilitL'indexationdespagessefontsurlapageprincipale, mais pas sur les contenus amens par AJAX. Les fonc-tionnalitsdunavigateur'prcdent,suivant'nepeu-vent s'exercer sur le contenu dynamique, et ainsi pna-liser l'utilisateur.Dessurcharges de maintenance et complexit du code La course sans cesse a une meilleur ergonomie, inte-ractivit avec le serveur, un SGBD,et une surenchre defonctionnalitsdesktop-like,peutacontrario,sur-charger le navigateur et le rseau. Lamaintenanceducodepeutdevenirproblmati-que et des conflits peuvent apparatre si on utilise plu-sieursframeworks,engendrantdesbugsdifficilement dtectables, surtout en mode asynchrone.Danslecasdeplusieursobjetsasynchrones,les problmatiques d'accs concurrentiel et de gestion des ressourcescomplexifierontlestchesd'criture,de tests et de dbogages. La nature mme d' AJAX, un ensemble de technolo-gies, devrait interpeller le dveloppeur sur la ncessit desparerlesscriptsdenaturesdiffrentes,d'utiliser sipossibleunmodleMVC,etd'avoiruneapproche pragmatique de son emploi certes ncessaire, mais pas toujours adquat.AvenirAJAXestuneconceptionetunearticulationautour d'un objet XMLHttpRequest. L'volution de cet ensem-bleseralarsultantedel'volutionetdelacohren-ce de ses composants. DOM et CSS continuent leurs progressionsaurythmedesrecommandationsdu W3C, l'intgration de HTML5 est en route. Les fonc-tions de timing, le retour d'objet BLOB, ainsi que l'int-gration du cross-domain, dans de nouveau objet com-meXDomainRequestdeMicrosoftoubienlanouvelle XMLHttpRequest 2, permettront de franchir nativement ces barrires.Figure 9. Visualisation du CSSFigure 10. Dbogueur du JavaScriptAjax et PHPwww.phpsolmag.org 33JEAN TATAREAUDiplmeningnierieetqualitdulogicielauCNAMdeBordeaux, l'auteurs'intresselaprogrammationetlaralisationlogiciel-ledepuisdenombreusesannes.Depuisplusdedeuxans,ilacr et dirigelasocitKiwiEngineering.Lesdomainesdeprdilection sont le travail faon d'applicatifs pour le professionnel ou le parti-culier au travers d'interfaces Web. Contact http://www.kiwi-engineering.net.Sur Internet http://www.adaptivepath.com/ideas/essays/archives/000385.php Article de rfrence, http://ajax.developpez.com/ Site d'information sur le developpement Ajax entre autres, http://www.w3.org/TR/XMLHttpRequest/ W3C du XMLHttpRequest, http://fr.php.net/manual/fr/book.simplexml.php PHP : simplexml, http://fr.php.net/manual/fr/book.json.php PHP : JSON, http://tools.ietf.org/html/rfc4627 Mmo sur JSON, http://msdn.microsoft.com/en-us/library/ms535874%28v=VS.85%29.aspx XMLHttpRequest Object, http://msdn.microsoft.com/en-us/library/cc288060%28v=VS.85%29.aspx XDomainRequest Object, https://developer.mozilla.org/en/XmlHttpRequest XMLHttpRequest de Mozilla, http://code.google.com/p/sqlite-manager/ plugin Mozilla.LaFigure12dattractionBLOB(BAGblobattract graph),montrelvolutionsuggestivedeXMLHttpRe-questversXMLHttpRequestversion2.L'objetasyn-chroneappelXHRdevientunattracteurplusorien-tcross-domain,cequinousamneredfinir AJAX encrossAJAX.Lecross-domainestmaintenantnatif AJAX, ce qui correspond la demande de croissante de nouveaux services externes et technologies distan-tes (Yahoo, Google, Amazon, Twitter). Par cette modi-fication de conformit, l'attraction des autres technolo-gies,tellesqueCSS3etHTML5formentautourde JavaScript une plus grande cohsion. Pour HTML 5, l'intgration audio-vido simple et ro-buste, contrle de formulaire, drag and drop, gestion de Figure 12. Graphe d'attraction BLOBl'historique ne sont plus des rles dvolus ou de faon moindreJavascript.PourCSS3,graphismesophis-tiqu et une interaction accrue avec le DOM. L'criture du code devient plus rigoureuse et cela ne peut qu'am-liorerlaprcisionetlaconcisiondespagesainsique leurs robustesses. D'autrespart,cesderniresprennentleurschar-gesdestchesquiauparavanttaientdvoluesJa-vaScript. On peut voir, sur le schma un nouvel quilibre quirenforcelarobustessedel'applicationdanslar-partition volumtrique de ses rles propres. En ce sens crossAJAX l'instar de AJAX de l'avenir, s'il dlaisse un peu les rles de widgets-gadgets que l'on lui fait tenir trop souvent. Note : leBAG (blob attract graph) est un conceptgraphiqueintuitifetsuggestifdveloppchez Kiwi-Engineering,del'expressiond'idesreposantsur l'attractivitrpulsion,compressionextensionde ses constituants.ConclusionL'augmentationdesdbitsInternetetdeladiversit d'applications sur PC mais aussi de diffrents terminaux, mobiles, tablettes, assurent la prsence incontournable d' AJAX. En revanche la prennit d'une solution infor-matiqueestunleurre,celle-cidoittreadapte,avec pragmatisme, la problmatique prsente.AJAX et le langage de l'lphant peuvent faire bon mnage et cela de manire lgante. Cette interaction dynamiqueentrelesdeuxmondesduserveuretdu client peuvent donner l'illusion d'une communication in-ter-langage, une alchimie qui dcuple la puissance de l'ensemble en s'appuyant sur les points forts respectifs de l'un et de l'autre.10/2010 34PratiqueNous travaillerons ici sur un serveur Debian 5.0 Lennyinstallsansaucunlogicielsupplmen-taire.Installation et configuration de lAMP, le serveur webQui dit hbergement de site, dit serveur web. Nous reste-rons sur le plus utilis au monde, Apache. Pour cela nous utiliserons la commande aptitude qui gre les paquets de Debianaptitude install apache2.Normalementsi vous affichez lIP de votre machine sur un navigateur vous devriez avoir la mythique page It works !.Le serveur MySQL et PHPMaintenant nous allons nous attaquer PHP et MySQL.aptitude install php5 php5-mysql mysql-servermysql-client mysql-commonIlpeutvousdemanderunmotdepassepourmysql, nousvousconseillonsdemettreunmotdepassedif-frentdeceluidusystme.Ilfautredmarrerapache pour que les modifications soient prises en compte./etc/init.d/apache2 restartMaintenantvousavezunserveurwebavecPHP et MySQLdinstalls.Pourvrifierquetoutfonctionne nous allons crer un fichier de visualisation de la confi-guration de PHP. En CLI, tapez : nano /var/www/index.php. Coller le contenu du Listing 1. Faites ensuite Ctrl X puis O (Y pour les Debian anglaises).Rendez-vousdansvotrenavigateurladressesui-vante :http://IPS/index.php.Rappelonsle,lerpertoire par dfaut dapache est /var/www/. Vous devriez trouvez Crerson propre hbergementNous verrons dans cet article comment crer un serveur dhbergement web avec un minimum de scurit. Dans une premire partie nous installerons/configurerons un AMP (Apache + MySQL + PHP), puis nous installerons des logiciels tierces pour les serveurs FTP, DNS, etc.Cet article explique : Installer et congurer un serveur Web (Apache, MySQL, PHP). Installer et congurer des services dhbergement (FTP, DNS). Installer et congurer les utilitaires (phpMyAdmin). Mettre un minimum de scurit. Crer un compte utilisateur. La lgislation et lhbergement web.Ce qu'il faut savoir : Utiliserlalignedecommandeenconsoledunlinux(debian ou pas). NousadmettronsqueIPSreprsentelIPduserveurovous installezvotreserveurdhbergementsdesite(127.0.0.1pour une installation sur le poste local).Figure 1. Rsultat dun phpinfo()Hbergement webwww.phpsolmag.org 35cette page. Si ce nest pas le cas, cest que tout ne sest pas install correctement. Dans ce cas, redmarrez apa-che2 et ressayez, si cela ne fonctionne toujours pas re-commencez les aptitudes.ConclusionVous disposez ds prsent dun serveur apache avec PHP/MySQL.Installation des services dhbergementsNousverronsicicommentinstallerlesservicesmini-mums lis lhbergement de sites web.Le serveur FTPDans le cas dun hbergement, il est en gnral plus in-tressant de proposer un protocole de dpt de fichier tel que le FTP. Personnellement je prfre proftpd, mais il en existe de nombreux autres.Commenonsparlinstaller :aptitude installproftpd. Il vous demandera de slectionner le mo-de dutilisation, il y a 2 cas de gure:Vous pensez accueillir peu de monde, juste pour un hbergementsemipersonnelalorsilestconseill deslectionnerinetdquiconsommerabeaucoup moins de ressources.Vousallezfaireunvraihbergementsurinternet pour hberger toute la toile (cest viser un peu haut mais qui sait) alors slectionner standalone qui as-sure un trs grand dbit.Notezquenouspouvonstoutmomentchangerce paramtredanslefichierdeconfigurationdeproftpd.Nousallonsmaintenantmodifierunpeulaconfigura-tion, ouvrez le fichier proftpd :nano /etc/proftpd/proftpd.confLigne 14 : ServerName LE-NOMDEVOTRESERVEURLigne 33 : retirer le # devant DefaultRoot ~ Enregistrer et quitter le fichier. Si vous avez mis une ins-tallation en standalone tapez la commande /etc/init.d/proftpd restart.LeparamtreDefaultRoot permetdebloquerlutili-sateur dans sondossier client, en effet sans ce para-mtre activ il pourrait voyager dans tout le disque dur du serveur (ou les permissions systme le permettent). Vous avez un serveur FTP fonctionnel !Le serveur DNSToutdabordquest-cequunserveurDNS(Domain Name Server) ? Cest un serveur qui convertit un nom en une IP. Il peut savrer utile pour hberger des sites Listing 1. Fichier index.php

Listing 2. Fichier DNS named.confzone "mondomaine.fr" IN {type master;le "/etc/bind/db.mondomaine.fr";};Listing 3. Fichier de zone DNS$TTL 86400@ IN SOA mondomaine.fr. monadresse.email.fr. (2010090501; Numro de srie sous la forme AAAAMMJJNN28800; Temps de rafraichissement7200 ; Temps avant nouvel essai864000 ; Temps d'expiration86400 ; Min TTL)NS premier.dns.fr.NS second.dns.com.mondomaine.fr. A 123.456.789.123monsousdomaine CNAME mondomaine.fr.Listing 4. Fichier portsentry.confADVANCEDPORTSTCP="1024" # Valeur du port maximum utiliser en mode avance en TCPADVANCEDPORTSUDP="1024"# Valeur du port maximum utiliser en mode avance en UDPADVANCEDEXCLUDETCP="113,139"# On exclue ces portsdu TCPADVANCEDEXCLUDEUDP="520,138,137,67"#On exclue ces portsde l'UDPIGNOREFILE="/etc/portsentry/portsentry.ignore" #Fichierdes IPs ignoresHISTORYFILE="/var/lib/portsentry/portsentry.history" #Le chier de logsBLOCKEDFILE="/var/lib/portsentry/portsentry.blocked" #Le chier des utilisateurs bloqusRESOLVEHOST = "0" # on dsactive la rsolution d'host(charge systme)BLOCKUDP="1"# on active le blocage de l'UDPBLOCKTCP="1"# Blocage du TCPKILLROUTE="/sbin/iptables -I INPUT -s $TARGET$ -jDROP" # Commande de blocage de l'attaquant ($TARGET$) reprsente l'IP.SCANTRIGGER="0" # Nombre de tentative tolrListing 5. Fichier portsentryTCPMODE="atcp"UDPMODE="audp"Listing 6. Extrait lter.d[Denition]failregex =\(\S+\[\]\)[: -]+ Maximum login attempts \(\d+\) exceeded$ #LE fail regex contient toutes les regex des attaque possible, reprsente l'IP dans la chaine.ignoreregex = # On peut ignorer certaine regex prcise, si ce n'est pas le cas (souvent) on laissevide.Listing 7. Extrait jail.conf[ssh]enabled = true # Activport = ssh # Port bloquerlter= sshd # nom du ltre (correspondant au nom du chier dans lter.d)logpath= /var/log/auth.log #Fichier de logmaxretry = 2 # Nombre de tentative maximum10/2010 36Pratiqueexpliquerlefonctionnementdunserveurmail.Vous trouverezlafindecetarticleunliencontenantune installation trs dtailledun serveur mail et de toute sa scurit.aptitude install postxSlectionnezSiteInternet,ennomdeserveurvotre-nomdedomaine.fr.Pardfautunserveurpostfixnen-voie que des emails provenant exclusivement de local-host,doncpasdeconfigurationfaireductdela configuration gnrale.ConclusionVous venez dinstaller le ncessaire pour procder un h-bergement mutualis, vos utilisateurs peuvent se connec-ter en FTP, vous avez votre propre serveur de DNS et un serveur mail pour lenvoi des e-mails depuis PHP.Installation des utilitairesNousallonsmaintenantinstallerdespetitsutilitaires pour vous aider grer votre plateforme.phpMyAdminphpMyAdminestuneapplicationPHPpermettantde grerlesbasesdedonnesMySQL.Pourlinstaller nousallonsutilisercommenotrehabitude aptitude, cependant sachez que vous pouvez linstaller en le t-lchargeant directement sur le site officiel de phpMyAd-min cest une simple archive dcompresser dans un dossier web. aptitude install phpmyadminDans linstallation slectionner apache2, une fois lins-tallation termine il faut recharger la configuration dapa-che via la commande /etc/init.d/apache2reload.Maintenantrendez-voussurhttp://IPS/phpmyadmin/et connectez-vous via lidentifiant root et le mot de pas-se mis dans linstallation.LogwatchLogwatch est un programme qui vous envoietous les matinsunrcapitulatifanalysdevoslogsserveurs. Parexemplepourapachevousrecevreztoutesles adresses retournes en erreur ou mme des tentatives de piratages via des injections, il affiche aussi toutes les connexions proftpd et ssh avec leur IP. aptitude install logwatchNous allons modifier le fichier de configuration pour quil envoie son e-mail notre boite e-mail.nano /usr/share/logwatch/default.conf/logwatch.conf moins que vous ne souhaitiez donner comme url vos membres votre IPS. Je nen connais que 2, le plus r-pandu est sans nul doute BIND assez simple de confi-guration. Cest celui que nous utiliserons ici, sinon il y a mydnsquiluiutiliseMySQLpourlesenregistrements (vite la cration de fichier de zone que nous allons voir par la suite). Nous ne verrons que le cas o le serveur estDNSprimairepuisquengnralonutilisedesser-veurs secondaires fournis par un prestataire.Commenonsparlinstaller :aptitude installbind9(Note:Ilsepeutquecederniersoitdjins-tall sur votre systme auquel cas il ninstallera rien, ce nest pas un problme). Donc pour configurer les DNS de nos futurs domaines nous allons avoir besoin de mo-difierlaconfigurationprincipaleduserveurDNSetde crer le fichier de zone. Modifier le fichier /etc/bind/na-med.confnano/etc/bind/named.conf.Allezenbasdu fichier et ajouter le texte du Listing 2.Quitter nano en enregistrant votre fichier. Maintenant nous allons crer le fichier de zone du domaine : nano /etc/bind/db.mondomaine.fr. Quitter nano en enregistrant votre fichier. Maintenant il faut recharger la configuration de bind : pour cela taper /etc/init.d/bind9 reload.Pour vrifier que votre serveur est bien configur je vous inviteeffectuerunzonecheckviahttp://www.zone-check.fr/demo/. Pour cela renseignez en zone votre nom de domaine et en DNS vos serveurs DNS. Vous pouvez voir un exemple de fichier de zone dans le listing 3.Le serveur MailNousverronsiciuneconfigurationtrsbasiquedun serveur e-mail puisque nous allons lutiliser uniquement pour lenvoi de-mail. Il faudrait un article complet pour Listing 8. Excution de la commande ad duserns:~# adduser pseudoAdding user 'pseudo' ...Adding new group 'pseudo' (1000) ...Adding new user 'at' (1000) with group 'pseudo' ...Creating home directory '/home/pseudo' ...Copying les from '/etc/skel' ...Enter new UNIX password:Retype new UNIX password:passwd: password updated successfullyChanging the user information for pseudoEnter the new value, or press ENTER for the defaultFull Name []:Room Number []:Work Phone []:Home Phone []:Other []:Is the information correct? [Y/n]Listing 9. Fichier de vhost d'apache

DocumentRoot /home/pseudo/ServerName pseudo.domaine.fr

phpadminvalueopenbasedir /home/pseudo/phpadminvalueuploadtmpdir "/home/pseudo/mtmp/"

Hbergement webwww.phpsolmag.org 37Ligne 44 : MailTo = root remplac le parMailTo [email protected] et quitter.La scurit dun hbergeur, le pare-feuLa premire scurit dun serveur rside dans son pa-re-feu. Je vous conseille dutiliser iptables pour le confi-gurer.Rappelons-leiptablesnestpaslepare-feude linux mais juste lutilitaire pour le configurer. Le pare-feu contenu dans le kernel sappelle netfilter.Je ne ferai pas une configuration complte dun pa-re-feu (il en existe beaucoup sur la toile), mais juste une explication simple. Iptables est constitu selon 3 tables (on peut en ajouter dautre) :INPUT, cest le trac entrant.OUTPUT, cest le trac sortant.FORWARD, cest le trac quon transfre.Le fonctionnement est trs simple : il applique toutes les rgles de ses tables en fonction des paquets en transit sil y a une rgle lui correspondant, il applique ce quon lui a demand. Dans le cas contraire il prend ce quon appelle la POLICY de la table et applique lordre.Les mise jours systmes et logicielsNous allons ici aborder laspect scuritaire dun hber-gement web. Tout dabord il faut mettre jour quotidien-nement son serveur via ses 2 commandes :aptitude updateaptitude safe-upgradeEn cas de changement de kernel pensez redmarrer le serveur.En cas dinstallations faites en dehors de la commande aptitude, phpMyAdminpar exemple, pensez vrifier les nouvelles versions, et de surtout mettre jour si une nou-velle version est annonce. Pour parler pratique, 200 ser-veurs se sont fait stopper le 10/08/2010 chez le fournisseur de serveur la hche pour une attaque phpMyAdmin.PortsentryNous allons maintenant voir portsentry qui est un utili-taire danti scan de port.aptitude install portsentryModifier la configuration en ouvrant /etc/portsentry/portsentry.conf et placez y le contenu.Maintenant mettez le contenu du listing 5 dans le fichier de configuration du mode par dfault de portsentry :/etc/default/portsentry/etc/init.d/portsentry restartVous remarquerez que lon ne fait quajouter una dans les modes, pourquoi ? Car on le met en mode avanc, cequinouspermetunscandetouslesportsinutilis jusqu 1024.Fail2banFail2banestunprogrammequipermetdebannirun utilisateur aprs un certain nombre dessai de mots de passe errons.aptitude install fail2banMaintenantrendonsnousdans/etc/fail2ban/.Vousy trouverez deux fichiers et deux dossiers. action.d :Cedossiercontienttousleschiersde congurationdesactionsfairepourbannir/en -voyer un email lorsque une attaque est dtecte.lter.d: Ce dossier contient toutes les rgles de d-tection sous le format du Listing 6. fail2ban.conf :Cechiercontientlaconguration duprogramme,Ilya3paramtrespossiblede base :o loglevel : De 1 4, 1 reprsentant le moins din-formation, par dfaut je recommande 3.o logtarget : Le chemin du chier de log des tenta -tives dattaque bloque.o socket : chemin du chier de socket. jail.conf:Lechierjail.confcontienttouslespa-ramtresdesrgles(activation,chierdelog, tentative maximum, etc). Il est compos en 2 par-ties :o Lapremireestunecongurationdebaseelle commenceparun[DEFAULT]onytrouve prin-cipalement les paramtres suivants :ignoreip : Liste des IPs ignorer, si vous tes en IP xe ne pas hsiter lajouter car 3 es -sais ou moins peuvent vite arriver.bantime : Temps de bannissement par dfaut dune IP en seconde.maxretry : Nombre dessais maximum.o La seconde (cf. Listing 7) est compose des pa-ramtresdelapremirepartiequonmodie(si onveututiliserlesvaleurspardfautonneles redni pas) etdautres paramtres.Une fois vos rgles dtermines,il ne reste plus qu re-dmarrer le service :Terminologie LAMP : Serveur compos de Linux, Apache, MySQL et Php. Netlter : Le module du kernel linux qui sert de par feu Iptables : Programme permettant dinteragir avec netlter POLICY : Rgle par dfaut du par feu10/2010 38PratiqueALEXANDRE BAZZETLauteur est tudiant en 3me anne SUPINFOet formateur STA Li-nux ; fondateur dIce Groups association dinformatique et dIce He-berg services dhbergement gratuit et payant./etc/init.d/fail2ban restart.Le resteIle