Système d'exploitation : Fedora 25 Workstation x86_64 (mais les exemples fonctionnent aussi sur RHEL ou CentOS 7)

Dépôts tiers : rpmfusion (pour écouter de la musique en travaillant) et évidement remi

# wget http://rpms.remirepo.net/fedora/remi-release-25.rpm
# dnf install remi-release-25.rpm
# dnf config-manager --set-enabled remi

Pour RHEL ou CentOS, lisez les instructions de l'assistant de configuration.

 

Installation des versions de PHP

J'utilise les Software Collections qui permettent d'installer plusieurs versions en parallèle sans toucher au système de base, les versions de PHP 5.4, 5.5, 5.6, 7.0, 7.1 et 7.2 sont disponibles dans mon dépôt, donc:

# yum install php56 php56-php-fpm php56-php-mbstring php56-php-mysqlnd ...
# yum install php70 php70-php-fpm php70-php-mbstring php70-php-mysqlnd ...
# yum install php71 php71-php-fpm php71-php-mbstring php71-php-mysqlnd ...
# yum install php72 php72-php-fpm php72-php-mbstring php72-php-mysqlnd ...
# yum install php73 php73-php-fpm php73-php-mbstring php73-php-mysqlnd ...
# yum install php74 php74-php-fpm php74-php-mbstring php74-php-mysqlnd ...

Les utilisateurs de RHEL peuvent aussi utiliser les SCL officielles disponible dans le canal RHSCL (php54, php55, rh-php56, rh-php70, rh-php71, rh-php72).

Les utilisateurs de CentOS peuvent aussi utiliser les SCL, maintenues par le SIG, disponibles dans le dépôt centos-sclo-sclo.

 

Configuration de l'environnement Web

PHP FastCGI Process Manager

Je n'utilise pas mod_php qui n'autorise qu'une seule version du module, mais FPM.

Je ne suis pas en production mais sur une station de développement, donc afin de limiter la charge, je modifie la configuration de chaque FPM pour utiliser le mode "ondemand". J'utilise aussi un port réseau différent pour chaque version

Example, pour PHP 7.0, dans le fichier /etc/opt/remi/php70/php-fpm.d/www.conf

listen = 127.0.0.1:9070
pm = ondemand

Je configure le port pour SELinux

# semanage port -a -t http_port_t -p tcp 9070

Et ensuite j'active le service

# systemctl start php70-php-fpm
# systemctl enable php70-php-fpm

Et j'applique pour chaque version.

Apache

Je crée 1 hôte virtuel pour chaque version de PHP

Dans le fichier /etc/hosts, déclaration des alias IP

192.168.0.15    myip php74scl php73scl php72scl php71scl php70scl php56scl

Création d'un fichier de configuration, avec les alias vers les dépôts git dans lesquels je travaille, ainsi que les hôtes virtuels: /etc/httpd/conf.d/remi.conf

    Alias /glpi090    "/work/GIT/GLPI/090-bugfixes"
    Alias /glpimaster "/work/GIT/GLPI/master"
    Alias /galette    "/work/GIT/galette/galette"

    <Directory "/work/GIT">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride All
        Require local
    </Directory>

    <VirtualHost *:80>
        ServerName php74scl
        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9074"
        </FilesMatch>
    </VirtualHost>

    <VirtualHost *:80>
        ServerName php73scl
        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9073"
        </FilesMatch>
    </VirtualHost>

    <VirtualHost *:80>
        ServerName php72scl
        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9072"
        </FilesMatch>
    </VirtualHost>

    <VirtualHost *:80>
        ServerName php71scl
        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9071"
        </FilesMatch>
    </VirtualHost>

    <VirtualHost *:80>
        ServerName php70scl
        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9070"
        </FilesMatch>
    </VirtualHost>

    <VirtualHost *:80>
        ServerName php56scl
        <FilesMatch \.php$>
            SetHandler "proxy:fcgi://127.0.0.1:9056"
        </FilesMatch>
    </VirtualHost>

Et j'utilise donc les adresses http://php74scl/, http://php73scl/, http://php72scl/, http://php71scl/, http://php70scl/ et http://php56scl/ dans mon navigateur. Chaque hôte sert les mêmes pages, mais avec la version choisie de PHP. Tous les hôtes fonctionnent en même temps.

Attention : vérifier que votre fichier de configuration est chargé "après" les php*.conf. Vous pouvez avoir à commenter les directives SetHandler dans ces fichiers (depuis Fedora 27 qui utilise FPM par défaut).

 

Ligne de commande

Pour passer d'une version à l'autre, je choisi simplement la version voulue en utilisant les modules d'environnements

$ module load php70
$ ...
$ module unload php70

Développement sur du code PHP

J'utilise évidement les outils disponibles dans le dépôt, et qui sont prévus pour fonctionner avec le PHP disponible.

# yum install atoum composer phpunit phpcompatinfo phpcs apigen ...

Par exemple :

$ git clone https://github.com/vendor/project.git
$ cd project
$ composer install
$ module load php73
$ phpunit --verbose
$ module load php70
$ phpunit --verbose
$ ...

Développement des extensions PHP

Il faut évidement installer les outils de développement

# yum install php74-php-devel php73-php-devel php72-php-devel php71-php-devel php70-php-devel php56-php-devel

Par exemple :

$ cd /work/GIT/uopz
$ module load php71
$ phpize
$ ./configure
$ make
$ make test

 

Conclusion

Cette configuration, qui me parait simple, me semble idéale pour un développeur qui a besoin de plusieurs versions de PHP mais veut se concentrer sur son travail, et bénéficier de l'ensemble des paquets disponibles dans une distribution assez complète, avec le bénéfice des Software Collections disponibles dans mon dépôt.

J'aurais aussi pu utiliser Docker... mais cette solution me semble bien plus simple, enfin j'utilise quand même Docker pour PHP 5.3.