PhpConcept

Developers Tools

  • Increase font size
  • Default font size
  • Decrease font size
Home White Papers

Créer un environnement de multi-développement en PHP

Print PDF

Introduction

Très rapidement lorsque l'on commence à développer en PHP, on se rend compte que l'on a plusieurs développements à faire. Il s'agit du développement d'un projet (par exemple PhpZip) et du développement d'un site Web qui permet de diffuser ce projet (par exemple PhpConcept).
Ces deux projets ayant des objectifs différents, des besoins différents, on en vient naturellement à vouloir faire tourner deux environnements de développement séparés, avec des paramètres différents.
Ce besoin est finalement beaucoup plus présent qu'on ne le croit et peut être (liste non exhaustive) :

  • Un environnement pour chacun des projets en cours,
  • Un environnement pour le site web diffusant le ou les projets,
  • Un environnement pour les scripts que l'on récupère sur internet et que l'on veut tester sans risquer de bousiller son projet en cours,
  • Un environnement pour un site web perso,
  • etc ...

Quels sont les besoins ?

Basiquement on voudrait pouvoir simuler des serveurs web différents, avec un service PHP configuré différemment, eventuellement avec des versions PHP différentes, sur des dossiers différents, ....

Il est donc nécessaire d'aller un peu plus loin que la configuration simple d'un serveur Apache (voir article 2), et la configuration d'un environnement PHP unique (voir article 3).

Dans les chapitres suivants on va détailler les différentes briques à mettre en place pour offrir cet environnement de développement multiple :

  • La définition de son environnement de projet,
  • La configuration des "Virtual Hosts" sur Apache, qui va nous permettre de définir plusieurs serveurs Web sur notre machine de développement,
  • La déclaration des différents serveurs web virtuels dans la table des noms,
  • La configuration de plusieurs environnements PHP pour chacun des projets (multiple php.ini),
  • La cohabitation de plusieurs versions PHP sur le même système.

Définition de son environnement de projet

L'organisation d'un environnement de projet est quelque chose d'assez personnel, et chacun fera donc ses propres choix au final. L'objectif ici est de mettre le doigt sur les points importants à prendre en compte, mais aussi proposer une structure, qui vaut ce qu'elle vaut, qui servira de support à cet article.

Dans tous les cas, il y aura une chose presque immuable, le point de départ du projet sera un dossier quelquepart sur la machine de développement. On se propose ici de prendre comme racine des projets de développement des scripts le dossier "C:\data\projets" et comme racine de développement des sites webs "C:\data\www".

Même si au démarrage on ne voit pas trop pourquoi on aurait plusieurs projets en parallèle, il ne coûte rien de mettre en place une structure permettant à terme de supporter d'autres projets. On va donc créer un dossier particulier pour chaque projet sous "C:\data\projets".
Un projet qui dure dans le temps va devoir être géré en prenant en compte des notions de "release" et des notions de "backup". On propose donc dans le dossier de projet de créer les entités "releases", "backups" et "dev". C'est sous "dev" que l'on va définir l'environnement de développement à proprement parler.

Pour la partie serveur web, la structure peut être plus simple. On peut retrouver un serveur "pur local" (localhost), qui serait un frontal pour gérer l'environnement de développement. Puis les serveurs web en développement qui auront eux leur pendant publié sur le web.

Configuration de "Virtual Hosts" sur Apache

Le serveur Web Apache supporte la notion de "serveurs virtuels" (Virtual Hosts), c'est à dire de faire tourner sur la même machine, avec la même adresse IP réseau, plusieurs serveurs Web distincts. Pour cela une configuration particulière est nécessaire au niveau du fichier httpd.conf du serveur Apache pour caractériser chaque serveur. Afin de faire la différence entre les différents serveurs Web de test, il sera nécessaire d'utiliser des noms de serveurs (www.phpconcept.net.local, test.local, ...) et non uniquement "localhost" ou l'adresse locale 127.0.0.1.

Le fichier httpd.conf définit les paramètres du serveur par défaut. Les directives "Virtual Hosts" vont permettre de redéfinir les paramètres que l'on veut changer. Les autres paramètres seront identiques à la configuration par défaut.

Dans un premier temps on va indiquer au serveur Apache que l'on va faire plusieurs sites web, de noms différents, sur la même adresse IP :

NameVirtualHost *:80

Il faut ensuite définir les serveurs virtuels. Le premier serveur virtuel est aussi le serveur par défaut, il n'est donc pas anodin. Si l'on appelle le serveur Apache par adresse IP (http://127.0.0.1), sans utiliser un nom (http://phpzip.local) on tombera sur le premier serveur "Virtual Host". On préférera donc définir en premier le serveur "localhost" :

<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "C:/data/www/localhost"
ServerName localhost
ErrorLog logs/localhost-error.log
CustomLog logs/localhost-access.log common
</VirtualHost>

Les points les plus importants sont "ServerName", qui indique le nom du serveur virtuel et "DocumentRoot" qui indique dans quel dossier se trouve les fichiers de ce serveur.
Les paramètres "ErrorLog" et "CustomLog" sont interessant, ils permettront d'obtenir des logs différents pour chaque serveur virtuel.

On va ensuite définir les autres serveurs virtuels, pour les Web en développement et pour les projets.

<VirtualHost *:80>
ServerAdmin This e-mail address is being protected from spambots. You need JavaScript enabled to view it .local
DocumentRoot "C:/data/www/www.phpconcept.net"
ServerName www.phpconcept.net.local
ErrorLog logs/www.phpconcept.net.local-error.log
CustomLog logs/www.phpconcept.net.local-access.log common
</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@phpzip.local
DocumentRoot "C:/data/projects/phpzip/dev"
ServerName phpzip.local
ErrorLog logs/phpzip.local-error.log
CustomLog logs/phpzip.local-access.log common
</VirtualHost>

Il est important ici de noter les points suivants :

  • Pour que la configuration soit prise en compte par le serveur Apache, il faut redemarrer celui-ci.
  • Chaque serveur virtuel doit ensuite être appelé par son nom : http://www.phpconcept.net.local ou http://phpzip.local. Les noms de domaines fictifs que l'on utilise ne peuvent être résolus par la fonction DNS (Domain Name Server). Il est donc nécessaire de remplir la table "hosts" de la machine de développement. Voir paragraphe suivant à ce sujet.

Les "Virtual Hosts" récupérant les propriétés par défaut il peut être nécessaire de préciser les droits d'accès particuliers à chaque dossier d'un projet ou d'un serveur en développement. Dans la configuration suivante, on précise que pour le dossier "C:/data/projects/phpzip/dev" on autorise l'indexation et la visualisation des dossiers ("Options Indexes")et que l'on n'autorise l'accès à ce serveur que depuis la machine locale ("Allow from 127.0.0.1").

<VirtualHost *:80>
ServerAdmin webmaster@phpzip.local
DocumentRoot "C:/data/projects/phpzip/dev"
ServerName phpzip.local
ErrorLog logs/phpzip.local-error.log
CustomLog logs/phpzip.local-access.log common

<Directory "C:/data/projects/phpzip/dev">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 127.0.0.1
</Directory>

</VirtualHost>


Il est aussi possible de définir les "Virtuals Hosts" dans des fichiers séparés, ce qui évite par la suite de toucher au fichier principal httpd.conf. Pour cela on indique dans le fichier httpd.conf où trouver tous les fichiers "Virtual Host" :

include conf/virtualhosts/*.conf

On créé le dossier "virtualhosts" dans le dossier "conf" de l'installation de Apache ("C:\Program Files\Apache Group\Apache2\conf"), dans lequel on met les fichiers de description des "virtual hosts". Ainsi pour créer un nouveau serveur virtuel il suffit de créer un nouveau fichier et redemarrer Apache, pour en supprimer un, de supprimer le fichier et de redemarrer.

 

Configuration de la table des noms

Lorsque l'on appelle un serveur web sur son navigateur par la commande "http://www.phpconcept.net.local", le navigateur va chercher à "résoudre le nom de machine" www.phpconcept.net.local, pour obtenir l'adresse IP (Internet Protocol) du serveur. Dans notre cas la machine n'existe pas réellement sur l'internet et cette résolution ne va pas aboutir si l'on ne fait rien de plus.

Pour que le navigateur aille chercher le serveur Apache de la machine de développement il faut indiquer à Windows que nos serveurs virtuels sont connus du serveur Apache. On va donc associer à tous les noms de serveurs virtuels créés l'adresse IP 127.0.0.1, qui veut dire "la machine locale" (localhost). Pour cela il faut ouvrir le fichier "hosts" se trouvant dans "C:\WINNT\system32\drivers\etc\hosts" (ou "C:\WINDOWS\system32\drivers\etc\hosts" pour Windows XP) :

On y ajoute alors les noms de nos serveurs virtuels :

La configuration des serveurs virtuels est maintenant terminée, ils peuvent être accedés par leur noms "http://www.phpconcept.net.local", etc ... depuis le navigateur.

On notera :

  • Le navigateur cherchant à résoudre sur internet le nom du serveur, il faudra choisir un nom qui n'existe pas. La méthode la plus simple est d'utiliser un "TLD" inexistant (par exemple ".local"). Il est aussi possible d'utiliser un nom de domaine que vous possédez réellement et pour lequel vous pouvez renseigner le DNS. Cette dernière méthode vous permettra de ne pas modifier le fichier "hosts", mais vous imposera d'être connecté sur Internet.
  • L'environnement PHP à ce niveau de la configuration est la même pour tous les serveurs virtuels, c'est celle définie dans le httpd.conf global. La mise en place de plusieurs configurations (multiple php.ini) sera détaillée dans le paragraphe suivant.

Configuration des environnements PHP

Dans l'article 3 nous avons vu comment installer et configurer PHP. En particulier nous avons vu qu'il fallait indiquer à Apache où se trouvait le moteur PHP. De plus dans le fichier de configuration de PHP (php.ini) certains paramètres sont liés au dossier dans lequel est installé le serveur Web ou le projet en développement.

Le serveur Apache installé sous Windows utilise le PHP en mode "CGI". Ce mode permet certaines configurations non disponible en mode "Module". Il est donc possible sous Windows de définir quel fichier php.ini doit être utilisé pour un serveur virtuel particulier.

Donc si l'on a installé PHP dans le dossier "C:\php\php-4.4.1-Win32", on va créer un dossier "php-ini-repository" dans lequel on va installer les configurations PHP de chaque serveur virtuel.
Pour chaque serveur virtuel on va donc créer un dossier avec le nom du serveur et placer dedans un fichier "php.ini" avec les configurations propre à ce serveur virtuel. Par exemple pour le projet PhpZip on va utiliser "C:\php\php-4.4.1-Win32\php-ini-repository\phpzip\php.ini"

Au niveau de la définition du serveur virtuel dans Apache on va donc avoir :

<VirtualHost *:80>
ServerAdmin webmaster@phpzip.local
DocumentRoot "C:/data/projects/phpzip/dev"
ServerName phpzip.local
ErrorLog logs/phpzip.local-error.log
CustomLog logs/phpzip.local-access.log common
<Directory "C:/data/projects/phpzip/dev">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 127.0.0.1
</Directory>

SetEnv PHPRC "C:/php/php-4.4.1-Win32/php-ini-repository/phpzip/" </VirtualHost>

On peut alors vérifier la prise en compte de ce fichier php.ini en utilisant la commande phpinfo() dans un script PHP :

Cohabitation de plusieurs versions PHP

Lors du développement d'un script PHP il est important de pouvoir le tester sous plusieurs versions PHP. Par exemple en PHP 4.x et en PHP 5.x. Il faudrait donc pouvoir dans son environnement de développement, non seulement avoir des environnements PHP configurés différement par projets, mais aussi des environnements PHP de version différentes.

Il n'y a pas de solution facile et légère pour répondre à ce besoin. On va donc utiliser les mêmes concepts que ceux décrit précedemment. On va devoir créer des serveurs virtuels différents pour les projets que l'on veut tester sous une autre version PHP.

Pour chaque projet que l'on veut tester avec du PHP5 par exemple, on va :

  • Installer PHP5 sur la machine de développement,
  • Créer un nouveau serveur virtuel sous Apache,
  • Le déclarer dans la table des "hosts".

> Installation de PHP5

On installe le dossier PHP5 dans le même dossier que PHP4. On notera qu'il y a un exécutable spécifique CGI en PHP5 qui s'appelle php-cgi.exe (et non plus php.exe).

De même que pour PHP4, on créé dans le dossier PHP5 un dossier "php-ini-repository" dans lequel on mettra les php.ini des différents projets.

> Créer un server virtuel pour PHP5

On déclare alors un nouveau serveur virtuel dans Apache. Ce serveur doit posséder un nom différent pour que Apache fasse la différence entre le PHP4 et le PHP5. On va utiliser par exemple "phpzip.php5.local". Par contre la déclaration "Virtual Host" fera référence au même dossier de développement. L'idée étant de dupliquer l'environnement de test, mais pas le code source du projet. Il faut aussi au niveau du "Virtual Host" déclarer que l'on veut faire du PHP5 et non plus le PHP4 qui a été déclaré par défaut dans le fichier "httpd.conf".

<VirtualHost *:80>
ServerAdmin webmaster@phpzip.php5.local
DocumentRoot "C:/data/projects/phpzip/dev/"
ServerName phpzip.php5.local
ErrorLog logs/phpzip.php5.local-error.log
CustomLog logs/phpzip.php5.local-access.log common
<Directory "C:/data/projects/phpzip/dev/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 127.0.0.1
</Directory>

Addtype application/x-httpd-php .php
ScriptAlias /php/ "C:/php/php-5.1.1-Win32/"
Action application/x-httpd-php "/php/php-cgi.exe"
SetEnv PHPRC "C:/php/php-5.1.1-Win32/php-ini-repository/phpzip/"
</VirtualHost>

On va aussi devoir déclarer le nouveau nom de serveur virtuel dans la table des "hosts" :

On peut alors à partir de là tester le code du projet avec une autre version de PHP :

La configuration d'un environnement multi-version de PHP est un peu lourde car il faut créer un nouveau serveur virtuel (apache, host table, php.ini), mais permet d'utiliser le même code source. Une fois installé l'environnement de développement, le passage d'une version à l'autre pour faire un test consiste simplement à changer le nom de domaine "phpzip.local" en "phpzip.php5.local".

Voir aussi

PhpConcept : Installer un environnement de Développement pour PHP
PhpConcept : Installer un Serveur Web Apache de développement sur Windows
Apache.org : Documentation sur les serveurs virtuels Apache (http://httpd.apache.org/docs/2.2/vhosts)

 

Last Updated on Monday, 18 January 2010 22:44