Faire cohabiter PHP4/PHP5 sur un seul Apache sous Linux
Par Edouard, samedi 6 novembre 2004 à 20:19 | Développement
(ancien article d'ICITrus.net : restranscription)
Introduction
Comme beaucoup le savent, faire cohabiter PHP4 et PHP5 sur un même serveur Apache reste assez problématique. En effet lors du chargement des modules il peut y avoir un conflit entre les deux versions de php. Concrètement, si elles sont installées et que l'on appel un script de cette façon http://localhost/phpinfo.php, le serveur ne saura pas quel interpréteur choisir et affichera donc le script comme un vulgaire fichier texte (affichage de la source).
Je vous propose ici une solution assez simple pour Linux (car pas de compilation en double...) : installer Apache et les versions de PHP, créer deux fichiers de configuration différents et démarrer deux instances d'Apache. Une instance chargera le module PHP4 et la seconde chargera le module PHP5.
Environnement de test
- Linux Mandrake 10
- XAMPP Linux 1.4.9a Site Officiel
Configuration
Après l'installation du serveur Apache et des deux versions de PHP (dans cet exemple, c'est le package XAMPP qui se charge de tout ça...) il faut copier le fichier httpd.conf qui doit se trouver normalement dans /opt/lampp/etc/ si vous avez utilisé XAMPP :
[kav@kav /]$ cd /opt/lampp/etc [kav@kav /]$ su Password: ******** [root@kav etc]# cp httpd.conf httpd-php4.conf [root@kav etc]# cp httpd.conf httpd-php5.conf
Par mesure de sécurité ne supprimez pas le fichier original au cas où...
Afin de séparer les scripts utilisants telle ou telle version il faut créer deux nouveaux répertoires dans le dossier /opt/lampp/htdocs
[root@kav htdocs]# cd /opt/lampp/htdocs [root@kav htdocs]# mkdir php4 [root@kav htdocs]# mkdir php5
Une fois les copies et créations de dossier achevées, éditez les deux nouveaux fichiers. Le premier sera configuré pour PHP4 et le second pour PHP5.
Edition du fichier httpd-php4.conf
Par défaut, le fichier httpd.conf de XAMPP charge le module PHP4 ou PHP5 selon le choix de l'utilisateur.
<IfDefine PHP4>
LoadModule php4_module modules/libphp4.so
</IfDefine>
<IfDefine PHP5>
LoadModule php5_module modules/libphp5.so
</IfDefine>
Il suffit dans ce cas de remplacer ces lignes par
LoadModule php4_module modules/libphp4.so
L'idée est de charger UNIQUEMENT le module PHP4. Maintenant faisons pointer la racine du serveur Web vers notre nouveau répertoire
DocumentRoot "/opt/lampp/htdocs/php4"
N'oublions pas aussi de modifier le path utilisé dans le <Directory ...> (changez en gros toutes les occurences : /opt/lampp/htdocs par /opt/lampp/htdocs/php4)
La dernière chose à faire est de changer le nom du fichier contenant le PID d'Apache afin de pouvoir lancer ultérieurement nos deux processus sans rentrer en conflit. Remplacez
<IfModule !mpm_netware.c>
PidFile logs/httpd.pid
</IfModule>
par :
<IfModule !mpm_netware.c>
PidFile logs/httpd-php4.pid
</IfModule>
Vous pouvez maintenant enregistrer et fermer le fichier httpd-php4.conf
Edition du fichier httpd-php5.conf
Dans le même principe que le fichier précédent nous allons faire exactement les même manipulations à une exception près. Je disais tout à l'heure que le serveur Apache écoute par défaut sur le port 80. Très bien, mais comme nous allons lancer par la suite deux Apache en même temps, s'ils écoutent sur le même port il y a de fortes chances pour que notre affaire ne marche pas... Pour cela il faut choisir un autre port, éditons le fichier et changeons tout ça
Listen 8080
Remplaçons
<IfDefine PHP4>
LoadModule php4_module modules/libphp4.so
</IfDefine>
<IfDefine PHP5>
LoadModule php5_module modules/libphp5.so
</IfDefine>
par :
LoadModule php5_module modules/libphp5.so
Puis modifions le DocumentRoot (ainsi que toutes occurences comportant le path par défaut)
DocumentRoot "/opt/lampp/htdocs/php5"
Et enfin changeons le nom du fichier PID
<IfModule !mpm_netware.c>
PidFile logs/httpd.pid
</IfModule>
par :
<IfModule !mpm_netware.c>
PidFile logs/httpd-php5.pid
</IfModule>
Il est aussi judicieux d'ajouter l'extension .php5 a la propriété AddType application/x-httpd-php et index.php5 à la propriété DirectoryIndex afin de bénéficier d'une plus grande souplesse pour vos scripts.
Démarrer Apache
Maintenant que toutes les configurations sont bonnes, il ne reste plus qu'à démarrer deux instances d'Apache :
[root@kav htdocs]# cd /opt/lampp/bin [root@kav bin]# ./apachectl -k start -f /opt/lampp/etc/httpd-php4.conf [root@kav bin]# ./apachectl -k start -f /opt/lampp/etc/httpd-php5.conf
Et voilà vos deux serveurs sont lancés avec leur version de PHP réciproque ! Pensez à bien les fermer proprement également
[root@kav bin]# ./apachectl -k stop -f /opt/lampp/etc/httpd-php4.conf [root@kav bin]# ./apachectl -k stop -f /opt/lampp/etc/httpd-php5.conf
Conclusion
Cette méthode n'est pas la plus propre dans le sens où deux Apache sont démarrés, ce qui en terme de performances n'est pas extraordinaire (mais pas trop nul non plus !). Sur un serveur dédié à cela ce n'est pas grave dans la mesure où il est fait pour ça et que d'autres applications ne sont pas censées être lancées. Il est évident que cette solution n'est pas la bonne pour des sites Web à fort traffic ! Mais pour un intranet ou un serveur perso c'est très bien :-) Il y a aussi des avantages :
- facilité de maintenance
- si un Apache plante, seule une version de php n'est affectée (donc une partie de la production seulement)
- pas de compilations multiples : gain de temps
Autres solutions
- Faire fonctionner PHP4 en CGI et PHP5 en module Apache comme sur cet article ou celui-ci (en anglais)
- Utiliser le mod_proxy avec deux serveurs. (en anglais)





