Framework PHP sous IIS Zend Framework (http://framework.zend.com) Avertissement Dans le cadre de cet article, nous avons besoin d’un environnement complet de développement (PHP sous IIS7 et SQL Server Express 2008). La mise en place de cet environnement est abordée dans deux autres articles : - « Web Platform Installer » pour l’installation de PHP sous IIS7 ; « Framework PHP sous IIS : Copix Framework » pour l’installation de SQL Server Express 2008. Si votre environnement de développement doit posséder à la fois WAMP et IIS, vous pouvez consulter l’article « Faire cohabiter WAMP et IIS ». Préambule Dans cet article, nous allons faire passer vers IIS7 un site Internet développé avec « Zend Framework ». Ce site est initialement hébergé par WAMP, au sein d’un environnement de développement, sur la base de la version 1.8.3 du framework. Le site que nous avons utilisé est une boutique en ligne de vente d’écharpes. La boutique sous WAMP Avant de commencer, regardons rapidement à quoi ressemble notre boutique en ligne lorsqu’elle est hébergée sous WAMP. La capture écran qui suit vous donnera une idée de son apparence. Dans notre cas, la configuration de WAMP a été modifiée afin que le serveur HTTP Apache écoute sur le port 8080. Ceci nous permet de ne pas être en conflit avec les applications et sites hébergés par IIS qui sont placés sur le port 80. Ainsi, pour accéder à la version WAMP de notre boutique, nous employons l’URL http://localhost:8080/echarpe-belle.com. Framework PHP sous IIS | Adenova 1 / 24 Création de la base de données Notre boutique en ligne a évidemment besoin d’une base de données. Cette base de données est actuellement hébergée par MySQL et s’appelle « echarpes ». Nous allons en faire une duplication pour SQL Server Express 2008 et nous l’appellerons « shop ». Ajouter la base de données Passons maintenant à la création de la base de données « shop » au sein de SQL Server Express 2008. Pour cela, nous allons utiliser l’outil de gestion associé : « Microsoft SQL Server Management Studio ». Dans la liste de vos programmes, dans le dossier « Microsoft SQL Server 2008 », il faut sélectionner « Microsoft SQL Management Studio ». Framework PHP sous IIS | Adenova 2 / 24 Si nécessaire, nous indiquons le mot de passe pour accéder à l’outil de gestion de SQL Server Express 2008. Dans la zone supérieure gauche de l’outil, nous faisons un clic droit sur « Base de données » puis nous choisissons l’option « Nouvelle base de données… ». Nous renseignons la boîte de dialogue qui s’affiche comme ci-dessous : Framework PHP sous IIS | Adenova 3 / 24 Pour paramétrer l’encodage de la base de données, il faut cliquer à gauche sur « Options » et choisir dans le menu « Classement » la valeur « SQL_Latin1_General_CP1_CI_AS ». Nous validons en cliquant sur le bouton « OK ». Notre base de données est maintenant créée, comme nous le montre l’illustration qui suit : Framework PHP sous IIS | Adenova 4 / 24 Génération d’un fichier SQL Pour assurer la création des tables et l’intégration des données au sein de la base de données « shop » que nous venons de créer, nous avons besoin d’un fichier SQL. Nous allons générer ce fichier SQL grâce à l’outil « MySQL Administrator ». Pour cela, lancez « MySQL Administrator » que vous trouvez normalement dans le dossier « MySQL » de la liste de vos programmes. Indiquez le mot de passe, puis cliquez sur « OK ». Dans la zone supérieure gauche de l’outil, choisissez « Backup » : Framework PHP sous IIS | Adenova 5 / 24 Ensuite cliquez en bas à droite sur le bouton « New Project », puis donnez le nom « export » au projet. Sélectionnez ensuite toutes les tables de la base de données « echarpes » : Dans le panneau « Advanced Options », activez les options comme dans l’illustration ci-dessous puis cliquez sur le bouton « Execute Backup Now ». Framework PHP sous IIS | Adenova 6 / 24 Pour plus de simplicité, prenez soin de nommer votre fichier SQL « export.sql ». Placez-le dans le dossier de votre choix. Modification du fichier SQL Les requêtes SQL de MySQL et de SQL Server n’étant pas parfaitement compatibles, nous allons procéder à quelques modifications à l’intérieur de notre fichier SQL généré. Ces informations ont déjà été présentées dans l’article « « Framework PHP sous IIS : Copix Framework ». Cependant, ce qui suit a été quelque peu adapté au contexte de notre article. Ouvrez donc le fichier « export.sql » dans votre éditeur préféré pour y apporter les modifications cidessous : - Supprimez toutes les guillemets doubles qui encadrent les noms des tables et des champs ; Supprimez les deux lignes ci-dessous (elles se trouvent plutôt au début du fichier) : CREATE DATABASE IF NOT EXISTS echarpes; USE echarpes; - Complétez le chemin d’accès aux tables en ajoutant devant tous les noms des tables l’information ci-dessous (ceci doit être fait pour les requêtes CREATE TABLE et INSERT) : shop.dbo.nomdematable1 Framework PHP sous IIS | Adenova 7 / 24 - Supprimer toutes les mentions ci-dessous (elles se trouvent toutes derrière les déclarations de création de table) : TYPE=InnoDB; - Supprimer également les mentions (si elles existent, elles suivent toujours la déclaration du type des tables) : AUTO_INCREMENT=X; Il est important de vérifier que les fins de déclaration de création de table (CREATE TABLE) se terminent toujours bien par un point-virgule. - - - Si des champs sont déclarés en AUTO_INCREMENT, remplacez cette mention par IDENTITY ; Si des champs sont déclarés en UNIQUE KEY nom (champ), remplacez cette mention par CONSTRAINT nom UNIQUE(champ) ; Supprimer toutes les définitions de longueur des champs INT ou TINYINT (par exemple INT(11) doit devenir simplement INT) ; Si possible, remplacer le type DOUBLE par le type MONEY pour une colonne chargée de stocker une information monétaire. Le type MONEY est proposé par toutes les bases de données SQL Server. Il permet de stocker des informations monétaires jusqu’à 19 chiffres dont 4 après le séparateur. On peut même y insérer certains symboles monétaires. Pour plus d’informations à ce sujet, vous pouvez consulter l’URL http://msdn.microsoft.com/frfr/library/ms188688.aspx. Sinon, remplacer le type DOUBLE par le type DECIMAL(6,2). La première valeur spécifie le nombre total de chiffres que l’objet peut posséder. La seconde, le nombre de chiffres qui peuvent être placés après le séparateur. Pour plus d’informations à ce sujet, vous pouvez consulter l’URL http://msdn.microsoft.com/fr-fr/library/ms187912.aspx. Dans les requêtes INSERT, supprimer tous les champs et valeurs associées qui sont définis en IDENTITY ; Protéger éventuellement les champs qui portent des noms réservés pour SQL Server par des crochets (nous n’avons pas dans notre cas) ; Doubler les éventuels guillemets droits simples présents dans les contenus des champs de type TEXT ou VARCHAR (par exemple, si on a comme texte : 'Petite soirée d\'hiver' », alors il doit devenir : 'Petite soirée d''hiver') ; Supprimer éventuellement les \r\n présents dans les contenus des champs de type TEXT ou VARCHAR ; Supprimer tous les commentaires placés au début du fichier, avant la première requête SQL (les suivantes ne devraient pas poser de problème). Enregistrez les modifications : notre fichier est prêt pour être importé dans SQL Server Express 2008. Création des tables et des données Nous allons maintenant créer les tables et les données dans SQL Server Express 2008 en utilisant notre fichier SQL modifié. Si l’outil « Microsoft SQL Server Management Studio » n’est pas lancé, lancez-le, indiquez le login « sa » et le mot de passe associé. Framework PHP sous IIS | Adenova 8 / 24 Dans la zone latérale gauche, déployez la liste des bases de données, et faîtes un clic droit sur la base de données « shop » que nous avons créée il y a quelques instants. Choisissez l’option « Nouvelle requête », puis faîtes un copier – coller du contenu du fichier « export.sql » que nous venons de modifier dans la partie centrale qui apparaît. Dans le menu « Affichage », « Barres d’outils », vérifiez que « Editeur SQL » soit coché. Pour envoyer les requêtes SQL au serveur, cliquez sur le bouton « Exécuter ». L’ensemble des tables et des données nécessaires au fonctionnement de notre boutique sont maintenant placées au sein de notre base de données « shop » sur SQL Server Express 2008. Plus loin dans cet article, nous verrons comment indiquer à notre application qu’elle doit faire appel aux données stockées dans notre base de données « shop » de SQL Server Express 2008. Framework PHP sous IIS | Adenova 9 / 24 Création du site Récupération et copie des sources Avant de procéder à la création de l’espace web de notre boutique, nous allons tout d’abord créer un dossier qui va contenir une copie de l’ensemble de nos sources. C’est vers ce dossier que l’alias créé ensuite pointera. Le dossier peut être créé à l’endroit qui vous convient. Dans notre cas, nous créons un dossier « echarpe-belle.com » dans « C:\work\web ». Nous y copions ensuite les sources. Comme notre boutique était précédemment hébergée sous WAMP, ses sources étaient placées dans le dossier « C:\wamp\www\echarpe-belle.com ». Il est important de vérifier que toute l’arborescence attendue par une application ou un site web développé avec Zend Framework soit présente. Création de l’alias Nous allons maintenant procéder à la création de l’espace web. Notre dossier est créé, il nous reste donc simplement qu’à indiquer à IIS la création d’un nouvel alias qui dirigera vers ce dossier. Pour créer l’alias « echarpe-belle.com » au sein d’IIS, nous allons utiliser le « Gestionnaire des Services Internet ». Quand le gestionnaire est initialisé, déplier l’arborescence de la zone latérale gauche jusqu’à voir la liste des sites. Dans la liste des sites, faîtes un clic droit sur « Default Web Site », puis sélectionnez l’option « Ajouter une application ». Framework PHP sous IIS | Adenova 10 / 24 La boîte de dialogue ci-dessous apparaît alors : Indiquez alors l’alias, puis dans le champ « Chemin d’accès physique », le dossier dans lequel nous avons placé les sources de notre boutique. Validez en cliquant sur le bouton « OK ». Pour visualiser le contenu de ce nouveau site, il suffit de faire un clic droit sur l’application « echarpebelle.com » que nous venons de créer, toujours au sein de la zone latérale gauche du « Gestionnaire de Services Internet ». Choisissez alors l’option « Gérer une application », puis « Parcourir ». Une Framework PHP sous IIS | Adenova 11 / 24 fenêtre s’ouvre alors au sein de votre navigateur par défaut à l’URL http://localhost/echarpebelle.com. Pour l’instant, nous obtenons l’affichage ci-dessous : Problématique des balises courtes d’ouverture de PHP Le souci d’affichage que nous obtenons est lié à la prise en charge des balises courtes d’ouverture de PHP (short_open_tag) par IIS. En effet, tous les scripts de vue et layouts de notre projet Zend Framework emploient ces balises courtes. Pour remédier à cela, nous allons modifier le fichier « php.ini » en utilisant le Bloc-notes en mode administrateur. Une fois le Bloc-notes lancé, il faut ouvrir le fichier « php.ini » qui se trouve dans le dossier « C:\Program Files\PHP » et y rechercher la directive « short_open_tag » pour placer sa valeur à « on » (au lieu de « off » par défaut). On termine en enregistrant les modifications apportées au fichier, puis en redémarrant IIS. Nous rappelons ici que pour redémarrer IIS, on utilise aussi le « Gestionnaire de Services Internet » : dans la zone latérale gauche, cliquez sur le nom de votre ordinateur, puis dans la zone latérale droite, cliquez sur l’option « Redémarrer », comme le montre la capture écran ci-dessous : Framework PHP sous IIS | Adenova 12 / 24 Nous actualisons la page de notre boutique à l’URL http://localhost/echarpe-belle.com et nous obtenons l’affichage ci-dessous : Framework PHP sous IIS | Adenova 13 / 24 Gestion de la réécriture d’URL (URL Rewriting) En cliquant sur le lien « Toutes nos écharpes », nous obtenons l’affichage ci-dessous : Framework PHP sous IIS | Adenova 14 / 24 Ceci est lié au fait que nous n’ayons pas encore configuré les règles de réécriture d’URL. Pour cela, il nous faut avant tout, procéder à l’installation du module de gestion de la réécriture d’URL. Le plus simple est d’utiliser Web Platform Installer. Nous y accédons en utilisant le Gestionnaire des Services Internet. Au sein du Gestionnaire des Services Internet, repérez l’icône Web Platform Installer et doublecliquez dessus. Framework PHP sous IIS | Adenova 15 / 24 Dès que Web Platform Installer est lancé, activez l’option « URL Rewrite 1.1 ». Si jamais une mise à jour de Fast CGI vous est proposée, activez-la également. Acceptez éventuellement les conditions d’utilisation et laissez l’installation s’opérer. Lorsqu’elle est terminée, quittez Web Platform Installer. Pour que nous ayons accès aux fonctionnalités de réécriture d’URL, nous devons aussi quitter le Gestionnaires des Services Internet et le redémarrer. Une fois que cela est fait, vous verrez apparaître l’icône ci-dessous : Cela confirme que le module de gestion de la réécriture d’URL est actif et correctement installé. Framework PHP sous IIS | Adenova 16 / 24 Nous pourrions utiliser l’interface de gestion des URL proposé par le module, mais le plus simple dans notre cas est de faire une copie des règles de réécriture proposées par Zend à l’URL http://framework.zend.com/manual/fr/zend.controller.html#zend.controller.quickstart.go.rew rite pour les placer dans un fichier « web.config » à placer dans la racine de notre espace web. Dans notre cas, ce fichier devra donc être dans le dossier « C:\work\web\echarpe-belle.com\public ». Les directives à placer dans ce fichier sont les suivantes : <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Imported Rule 1" stopProcessing="true"> <match url="^.*$" /> <conditions logicalGrouping="MatchAny"> <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="false" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="false" /> </conditions> <action type="None" /> </rule> <rule name="Imported Rule 2" stopProcessing="true"> <match url="^.*$" /> <action type="Rewrite" url="index.php" /> </rule> </rules> </rewrite> </system.webServer> </configuration> Utilisez votre éditeur de texte préféré pour ajouter ces directive dans le fichier « web.config », enregistrez les modifications apportées. Pour visualiser ces règles de réécriture d’URL au sein du Gestionnaire de Services Internet, vous devez sélectionner dans la zone latérale gauche le site Internet que vous avez ajouté puis doublecliquer sur l’icône « URL rewrite » : Framework PHP sous IIS | Adenova 17 / 24 Vous devriez alors voir apparaître la liste des règles comme ci-dessous : En double-cliquant sur une des règles de réécriture, vous pourrez voir comment il se compose. Comme promis, voyons maintenant comment indiquer à notre application qu’elle doit faire appel aux données stockées dans notre base de données « shop » de SQL Server Express 2008. Framework PHP sous IIS | Adenova 18 / 24 Modifier la configuration d’accès aux données Dans notre cas, l’accès à la base de données est configuré dans un fichier « config.ini ». Il est placé dans le dossier « C:\work\web\echarpe-belle.com\application\config ». Ce fichier de configuration contient une section « [database] » qui contient tous les paramètres de connexion à la base de données. Nous allons les modifier pour désormais accéder à la nouvelle base de données « shop ». Voici ce que nous avions précédemment à la section « [database] » : [database] database.adapter database.params.host database.params.port database.params.username database.params.password database.params.dbname = = = = = = Pdo_Mysql localhost 3307 root echarpes PRECISION : DANS NOTRE CAS, LE PORT D’ACCES A LA BASE DE DONNEES MYSQL A ETE PARAMETRE 3307 CAR NOUS AVONS PLUSIEURS INSTANCES DE CETTE BASE DE DONNEES INSTALLEES AU SEIN DE NOTRE ENVIRONNEMENT DE DEVELOPPEMENT : UNE POUR FONCTIONNER AVEC WAMP ET UNE AUTRE POUR FONCTIONNER AVEC IIS. DE PLUS, NOTRE CONFIGURATION D’ACCES A MYSQL NE POSSEDE PAS DE MOT DE PASSE, CE QUI NE SERA PAS LE CAS POUR LA CONFIGURATION D’ACCES A SQL SERVER EXPRESS 2008. Nous modifions le contenu de cette section comme ci-dessous : [database] database.adapter database.params.host database.params.username database.params.password database.params.dbname = = = = = Pdo_Mssql BASILIC sa votremotdepasse shop La ligne qui détermine le port a été supprimée car nous utilisons le port par défaut de SQL Server. Pour la ligne qui définit l’hôte, il faut y placer le nom de votre machine. Et le plus important, bien sûr, c’est d’indiquer l’adaptateur PDO qui convient : nous utiliserons évidemment « Pdo_Mssql ». ATTENTION : CELA SUPPOSE BIEN SUR QUE L’EXTENSION PDO_MSSQL SOIT INSTALLEE ET ACTIVE. SI CE N’EST PAS LE CAS VOUS POUVEZ VOUS REPORTER A L’ARTICLE « FRAMEWORK PHP SOUS IIS : COPIX FRAMEWORK ». En actualisant la page http://localhost/echarpe-belle.com/toutes-nos-echarpes de notre boutique, nous obtenons l’affichage qui suit : Framework PHP sous IIS | Adenova 19 / 24 Ceci est dû au fait que certaines requêtes SQL décrites pour MySQL ne sont pas compatibles avec SQL Server. L’erreur ci-dessus nous indique que la requête qui pose problème est « SET NAMES 'utf8' » qui permet de garantir sous MySQL que toutes les transactions à suivre se feront en utilisant l’encodage UTF-8. Nous allons simplement retirer de notre code source l’appel à cette requête. Dans notre cas, cet appel se situe dans le module « shop », dans le contrôleur « products », au sein de l’action « list ». Nous actualisons à nouveau notre page. Cette fois nous obtenons l’affichage ci-dessous : Framework PHP sous IIS | Adenova 20 / 24 SQL Server nous retourne l’erreur suivante : La colonne 'categories.idCategory' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY. Cette erreur apparaît parce que la colonne « idCategory » de la table « categories » n’est pas appelé dans la clause « GROUP BY ». Nous modifions donc simplement notre requête comme ci-dessous : $sql $sql $sql $sql = "SELECT .= "RIGHT .= "GROUP .= "ORDER c.name category, c.idCategory id FROM categories c "; JOIN products p ON c.idCategory = p.idCategory "; BY c.idCategory, c.name "; BY category"; Ce qui est souligné et en italique correspond à ce qui a été ajouté pour que notre requête devienne fonctionnelle. Gestion de l’encodage Comme les transactions ne se font plus en UTF-8, il faut penser à encoder ce qui est affiché par les scripts de vues et les layouts en UTF-8 en utilisant tout simplement la fonction PHP « utf8_encode() ». Par exemple, le titre d’une de nos écharpes ne se présente pas correctement : Framework PHP sous IIS | Adenova 21 / 24 Pour corriger ce problème, nous ouvrons le script de vue chargé d’afficher la liste des produits. Dans notre cas, il s’agit du fichier « products.phtml » stocké dans « C:\work\web\echarpebelle.com\application\modules\shop\views\scripts ». A la L. 5 de ce fichier nous ajoutons l’appel à la fonction PHP « utf8_encode() » : <p class="product-item-name"><strong><?= utf8_encode($this->name); ?></strong></p> Après correction, si nous visualisons à nouveau notre écharpe, nous observons que l’affichage est devenu correct : Framework PHP sous IIS | Adenova 22 / 24 Résultat Pour terminer, nous actualisons la page qui liste les produits de notre boutique et nous obtenons le résultat ci-dessous : Framework PHP sous IIS | Adenova 23 / 24 En quelques étapes, nous avons donc réussi à migrer notre boutique développée avec Zend Framework sous IIS et SQL Server Express 2008. Framework PHP sous IIS | Adenova 24 / 24