Bonjour,
Introduction
Quand on installe php5 et php7 sur son ordinateur (ou serveur), on ne peut en utiliser qu’un. Malheureusement, des fois, il nous faut tester le même site sous différentes versions de php. Et des fois, on aimerais travailler sur 2 projets qui nécessitent des versions de php différentes.
Je suis passé par plusieurs solutions plus ou moins efficaces, comme les machines virtuelles, 2 serveurs apaches sur 2 ports différents, etc.
La solution en théorie
J’ai fini par trouver la solution idéale :
Php en fast cgi et une variable dans htaccess pour choisir la version à executer. Théoriquement on pourrait avoir au sein du même site, une version différente de php par répertoire (site vitrine, blog…). Dans la pratique, on met un seul htaccess à la racine du site et c’est tout.
On peut aussi paramétrer php-fpm pour que les sites aient l’utilisateur et le groupe d’un compte spécifique, utile pour accorder les droits sur le site et sur ftp et les mettant sur un utilisateur système commun.
On va détailler ici uniquement la partie transformation de php de module vers fast cgi.
Je pars du principe que les 2 versions ont été installées via le repository de la distribution, pour debian :
sudo apt-get install apache2 php7.2 libapache2-mod-php7.2 mysql-server mysql-client php7.2-mysql phpmyadmin php7.2-odbc php7.2-curl php7.2-json php7.2-xml php7.2-mbstring
C’est typiquement ce que j’installe pour avoir un serveur de développement lamp fonctionnel.
On imagine donc que sur le serveur il y ait php5, php7.0 et php7.2 d’installés.
La version exécutée par apache dépend de l’ordre d’installation. Je suppose que dans une utilisation normale, on a installé php7.2 en dernier et c’est donc lui qui anime tous les sites sur lesquels on travail.
La soluton en pratique
Il faut tout d’abord arrêter apache
sudo service apache2 stop
Ensuite on supprime tous les modules php
sudo rm -f /etc/apache2/mods-enabled/php* sudo apt-get remove --purge 'libapache2-mod-php*'
On installe la version cgi de php
sudo apt-get install libapache2-mod-fastcgi php5-fpm php5-cgi php7.0-fpm php7.0-cgi php7.2-fpm php7.2-cgi
On active le module actions
sudo a2enmod actions
On configure fastcgi
sudo nano -w /etc/apache2/mods-enabled/fastcgi.conf
Mettre le contenu suivant
<IfModule mod_fastcgi.c> AddHandler fastcgi-script .fcgi #FastCgiWrapper /usr/lib/apache2/suexec FastCgiIpcDir /var/lib/apache2/fastcgi AddType application/x-httpd-php5 .php5 .php AddHandler php5 .php5 .php Action php5 /cgi-php5 Alias /cgi-php5 /usr/lib/cgi-bin/php5 FastCgiExternalServer /usr/lib/cgi-bin/php5 -socket /var/run/php5-fpm.sock -pass-header Authorization AddType application/x-httpd-php7.0 .php7 .php AddHandler php7.0 .php7 .php Action php7.0 /cgi-php7.0 Alias /cgi-php7.0 /usr/lib/cgi-bin/php7.0 FastCgiExternalServer /usr/lib/cgi-bin/php7.0 -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization AddType application/x-httpd-php7.2 .php7 .php AddHandler php7.2 .php7 .php Action php7.2 /cgi-php7.2 Alias /cgi-php7.2 /usr/lib/cgi-bin/php7.2 FastCgiExternalServer /usr/lib/cgi-bin/php7.2 -socket /var/run/php/php7.2-fpm.sock -pass-header Authorization <Directory /usr/lib/cgi-bin> Require all granted </Directory> </IfModule>
Le bloc précédent est un peu indigest mais en le lisant, on voit qu’il y a 3 blocs, 1 pour chaque version de php.
Il ne reste plus qu’a activer apache
sudo service apache2 start
Tout devrait fonctionner comme avant. Y compris, la version php7.2 par defaut.
Pour changer cela, dans le htaccess, on mettra le code suivant
<IfModule mod_fastcgi.c> AddHandler php5 .php #AddHandler php7.0 .php #AddHandler php7.2 .php </IfModule>
Il suffit de décommenter la ligne qui nous intéresse et de commenter les autres. On peut aussi supprimer celles qui ne nous intéressent plus.
Conclusion
Voilà, c’est la configuration que j’utilise sur les serveurs de développement. Cela permet d’avoir un seul serveur qui pourra s’adapter à toutes les versions de php.
Je ne sais pas comment c’est fait chez free.fr, mais je suppose que c’est très similaire, on peut donc supposer que cette méthode (avec un réglage de fpm plus approfondi pour les droits) peut convenir à un serveur de prod.