I. Introduction▲
I-A. Remerciements▲
Je remercie wamaniaProfil Developpez de wamania et pcabocheProfil Developpez de pcaboche pour leur relecture attentive et pour leurs conseils lors de la rédaction de la version initiale (2006) de cet article.
I-B. Pourquoi avoir besoin de plusieurs versions différentes en même temps ?▲
Lorsque l'on développe des applications Web, il est souvent utile, voire nécessaire, de prévoir le comportement de notre application dans diverses situations. Un développeur Web ne maîtrise pas toujours l'hébergement de son client, ce qui le confronte à des versions très variées de logiciels dans la mesure où les hébergeurs suivent généralement les versions de leur distribution Linux, or ces dernières ne mettent pas leurs paquetages à jour au même rythme.
Disposer de plusieurs versions d'Apache httpd et de PHP permet non seulement de consolider vos applications, mais aussi de prendre de l'avance sur l'hébergeur de vos clients. Ainsi, lorsque l'hébergeur de votre client met à jour ses paquetages, vous avez déjà eu le temps de vérifier que vos applications fonctionnent correctement dans ce nouvel environnement.
I-C. Préambule▲
Que vous soyez débutant ou confirmé, vous avez certainement remarqué la diversité des versions de PHP. Actuellement, la version la plus courante en environnement de production est la branche 5. Il n'y a plus aucun intérêt à laisser en ligne les versions 3 et 4 de PHP.
Toutefois, sous Windows, il y a de très grandes disparités au sein de la branche 5.x : la méthode de compilation avant PHP 5.2.7 utilisait Microsoft Visual Studio 6 (VC6) tandis que, depuis PHP 5.2.7 (ainsi que pour les branches 5.3 et 6.0), le compilateur est devenu Microsoft Visual Studio 2008 (VC9). Cela génère des différences e comportement, surtout si vous souhaitez utiliser PHP en tant que module d'httpd, ce qui est très souvent le cas.
Pourquoi passer de Microsoft Visual C++ 6 à Microsoft Visual Studio 9 ? D'une part, les logiciels compilés avec Microsoft Visual Studio 9 sont plus rapides et plus stables que ceux compilés avec Microsoft Visual C++ 6 ; d'autre part, Visual C++ 6 est tout simplement vieillissant. Chaque nouveau compilateur de la gamme Visual Studio apporte son lot d'améliorations de performances et de stabilité, ainsi que le support et une meilleure intégration dans les nouveaux systèmes d'exploitation de la gamme Windows.
J'ai expliqué les causes de cette différence sur les forums : https://www.developpez.net/forums/d637984-3/php/langage/pensez-php-5-3-a/#post4451568Sondage : Que pensez-vous de PHP 5.3 ?
Jusqu'à la branche 5.2, PHP était compilé avec Microsoft Visual C++ 6, un outil qui n'est plus disponible sur le marché. Il n'est donc plus possible de continuer avec VC6.
Cependant, la quasi-totalité des projets open source sont compilés avec cet outil encore aujourd'hui. Ils ont l'avantage d'avoir des « build box » qui fonctionnent encore, ce qui n'est plus le cas de PHP. Le projet PHP a eu le malheur de voir partir « la » personne qui savait comment fonctionnait la machine de pecl4win… Plus personne ne sait comment la configurer, il a donc été décidé de l'arrêter.
De toute manière, VC6 est… Vieux. Il était grand temps de passer à une nouvelle version du compilateur et de pousser les autres projets open source à faire de même.
La nouvelle optique est de compiler à l'aide de Visual Studio 2008, aka VC9.
Le problème est que les fichiers binaires compilés sous VC9 ont besoin de DLL compilées avec la même version du compilateur, à savoir que l'on ne peut pas utiliser une extension PHP compilée avec VC6, pour un PHP compilé avec VC9. De même, Apache doit lui aussi être compilé avec le même outil que le reste. Lorsqu'il s'agit de mod_php, toute la chaîne doit être compilée avec le même outil. En mode CGI ou FastCGI c'est différent, Apache et PHP peuvent être compilés différemment, mais les extensions doivent néanmoins correspondre à la signature du binaire PHP… Donc le problème reste entier.
Bien entendu, compiler PHP lui-même sous VC9 n'est pas un problème. Il y a de nombreux tutos pour le faire, en voici un exemple : http://wiki.php.net/internals/windows/stepbystepbuild
Pour Apache : https://fabien-faille.developpez.com/tutoriels/apache/windows-compiler/
Cependant, pour compiler PHP, il faut s'assurer que toutes ses dépendances soient aussi compatibles VC9. Il en va de même pour chacune des extensions « core » et de chacune des extensions « PECL ». Chaque extension utilisant une bibliothèque externe doit aussi compiler ces dépendances avec VC9, ce qui suppose de prendre contact avec l'auteur de chacune de ces dépendances afin qu'il mette son projet à jour.
La liste complète des dépendances est disponible ici avec un état des lieux : http://wiki.php.net/internals/windows/libs
La liste complète des dépendances qui ont pu être migrées est disponible ici : http://pecl2.php.net/downloads/php-windows-builds/php-libs/
Cela vous donne une idée de l'énorme quantité de travail faite par la nouvelle équipe de compilation de PHP pour Windows (PierreBlog de Pierre, ElizabethBlog d'Elizabeth, GarrettBlog de Garrett et les autres) simplement pour « PHP core ».
Téléchargements :
- PHP compilé pour Windows (VC6 et/ou VC9 suivant le cas) : http://windows.php.net/
- Apache httpd compilé pour Windows (VC9) : http://www.apachelounge.com/
- Extensions PECL compilées pour Windows (adresse temporaire, VC6 et/ou VC9 suivant le cas) : http://downloads.php.net/pierre/
Informations liées :
- Microsoft donne 100 000 $ Ã l'Apache Software Foundation
- Compiler PHP et toutes ses dépendances sous Windows (MSVS 200x)
- Lancement du cycle de sortie de PHP 5.3
Nous allons utiliser plusieurs versions du serveur Web Apache et tirer profit de l'application « Apache Service Monitor » afin d'installer plusieurs versions de PHP sur l'ordinateur vous servant dans vos développements. De cette manière, il vous sera possible de changer de version de PHP en quelques clics. Bien sûr, un utilisateur chevronné saura tirer profit de cette technique pour installer encore davantage de configurations différentes. Nous nous contenterons ici d'en installer trois.
Comme je l'ai suggéré plus tôt, il est possible d'adapter ce tutoriel de façon à utiliser plusieurs versions identiques de PHP, mais en les configurant différemment.
Avant de commencer, assurez-vous qu'aucun service Windows n'utilise le port 80. En particulier, IIS a tendance à se lancer après certaines mises à jour de Windows : si c'est votre cas, commencez par le désactiver (ainsi que tout autre serveur Web). De même, si vous utilisez Skype, sa configuration par défaut lui permet de monopoliser le port 80 (cela peut se désactiver sans inconvénient).
I-D. Correspondances de versions▲
Pour installer PHP en tant que module d'httpd, il faut considérer que les flags de compilation doivent être identiques pour les deux programmes. Ils doivent être compilés non seulement avec le même compilateur, mais aussi avec les mêmes options de compilation.
Voici les options de compilation à identifier :
- Thread safety : oui / non ;
- Architecture : x86 (pour processeur 32 bits) ou x64 (pour processeur 64 bits) ;
- Debug : oui / non.
Ces options doivent être identiques pour PHP et pour httpd. C'est pour cela que nous aurons besoin de plusieurs versions d'httpd si nous souhaitons disposer des versions 5.2, 5.3 et 6.0 de PHP.
I-E. Logiciels requis▲
N'installez aucun logiciel pour le moment. Dans cette partie, nous nous contenterons de télécharger les logiciels que nous souhaitons installer.
I-E-1. Apache httpd▲
Nous aurons également besoin du serveur Web Apache httpd. C'est le plus populaire des serveurs Web du marché et c'est à la fois l'un des plus stables et des plus puissants.
Pour écrire ce tutoriel, j'ai utilisé la version 2.2 compilée avec VC6, disponible sur le site officiel : httpd.apache.orgTéléchargement d'Apache httpd. Prenez la version « Win32 Binary including OpenSSL ».
Vous aurez également besoin de la version 2.2 compilée avec VC9, disponible sur Apache LoungeTéléchargement d'Apache httpd.
Ces fichiers binaires sont compilés avec le flag Thread Safety, pour une architecture x86 et sans les informations de Debug.
I-E-2. PHP▲
Nous utiliserons plusieurs versions de PHP. À chaque fois, nous téléchargerons la version Zip plutôt que l'assistant d'installation. La raison est simple : l'assistant d'installation n'est pas utile pour installer PHP.
Pour écrire ce tutoriel, j'ai utilisé les versions :
- PHP 5.2 VC6 x86 Thread SafeTélécharger PHP
- PHP 5.2-latest VC6 x86 Thread SafeTélécharger PHP
- PHP 5.3 VC9 x86 Thread SafeTélécharger PHP
- PHP 5.3-latest VC9 x86 Thread SafeTélécharger PHP
Il est bien entendu possible d'ajouter PHP 6.0 à cette liste, mais le site windows.php.net ne le propose pas en téléchargement à l'heure de l'écriture de ces lignes. Vous le trouverez dans la partie « Snapshots ».
I-E-3. Sysinternals Junction▲
Ce logiciel permet de créer des répertoires symboliques, appelés NTFS junction points. Ce sont des liens de répertoires à la mode UNIX. Vous pouvez utiliser le logiciel de votre choix, mais ce tutoriel se contentera de Sysinternals Junction. Il est disponible sur Technet : Junction v1.05 ; placez le fichier junction.exe dans le répertoire de Windows avec la ligne de commande suivante :
copy
junction.exe %WINDIR%
Ce logiciel ne fonctionne pas sous toutes les versions de Windows (uniquement Windows 2000 et ultérieurs), et votre disque doit être au format NTFS. Renseignez-vous sur le site indiqué ci-dessus si vous avez le moindre doute.