Introduction

L’un des avantages de Manjaro est d’être une rolling-release. Les dernières versions des paquets sont rapidement disponibles et installées. Cet avantage peut également être un inconvénient lorsque l’on fait du développement web. Certains outils ne sont pas forcément compatibles avec ces nouvelles versions.

Par exemple, si vous souhaitez installer Prestashop localement, la version 1.7.8 n’est pas compatible avec PHP 8. Seules les versions 7 à 7.4 de PHP sont supportées.

Plutôt que de désinstaller PHP 8 pour installer une version antérieure, il est plus intéressant de mettre en place un système pour utiliser plusieurs versions en même temps. Nous allons voir comment faire.

PHP logo

Installer les outils nécessaires

phpenv

phpenv est un outil permettant de gérer plusieurs versions de PHP en même temps. Le projet est distribué sous licence MIT et fonctionne aussi bien pour Linux que pour Mac. Nous allons donc l’installer.

Il existe un paquet nommé phpenv-git dans les dépôts AUR, installable avec yay, mais je ne sais pas s’il est vraiment à jour puisque sa dernière mise à jour date de 2016. Je vais plutôt suivre les instructions disponibles sur le dépôt de phpenv.

Pour commencer on clone le dépôt dans notre dossier utilisateur :

git clone git://github.com/phpenv/phpenv.git ~/.phpenv

Si vous souhaitez installer phpenv à un autre endroit que la racine de votre $HOME, vous aurez également besoin de définir une variable d’environnement dans la configuration de votre shell :

export PHPENV_ROOT="~/le-chemin-souhaité/phpenv"

Ensuite, on ajoute phpenv à notre PATH pour pouvoir l’utiliser en ligne de commande et on ajoute phpenv init pour activer le partage de mémoire et l’autocomplétion. Pour cela, il faut éditer le profil de votre shell, .bash_profile pour Bash ou .zshrc pour Zsh par exemple.

Vous pouvez utiliser echo pour aller plus vite :

echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(phpenv init -)"' >> ~/.zshrc

Ou, vous pouvez l’éditer manuellement. Ainsi, on garde un profil propre et on évite des erreurs si on copie le fichier dans un autre système d’exploitation.

nano ~/.zshrc

Et on ajoute en fin de fichier :

# phpenv
if [[ -d $HOME/.phpenv ]]; then
    export PATH="$HOME/.phpenv/bin:$PATH"
    eval "$(phpenv init -)"
fi

Enfin, il faut redémarrer le shell pour que les changements prennent effet :

exec $SHELL -l

Cette étape est finie. Si une nouvelle version sort, vous pourrez facilement mettre à jour phpenv grâce à Git :

cd ~/.phpenv
git pull

php-build

À lui seul, phpenv n’est pas suffisant. Il nous faut un autre outil pour construire les différentes versions de PHP que l’on souhaite utiliser : php-build. Ce dernier est également distribué sous licence MIT et fonctionne aussi bien sur Linux que sur Mac. Il est lui aussi disponible dans les dépôts AUR, mais encore une fois, je vais plutôt suivre les instructions disponibles sur le dépôt du projet.

Nous allons l’installer en tant qu’extension pour phpenv :

git clone https://github.com/php-build/php-build $(phpenv root)/plugins/php-build

C’est tout pour cette étape ! Par contre, pensez à garder PHPBuild à jour pour profiter des nouvelles versions de PHP :

cd $(phpenv root)/plugins/php-build
git pull

Extensions optionnelles

phpenv propose d’autres extensions que php-build. Cependant, il semble difficile de trouver une liste de ce qui est disponible. J’en ai noté deux :

  • phpenv composer : facilite l’intégration de Composer en fonction de la version PHP utilisée.
  • phpenv-aliases : elle permet de définir des alias et il est ainsi possible d’utiliser une version de PHP sans préciser le numéro de patch (exemple : 7.4 au lieu de 7.4.18).

Installer et utiliser une autre version de PHP

Reprenons l’exemple de départ : Prestashop. Pour pouvoir l’installer, vous aurez besoin de PHP 7.4.

Installation

phpenv fournit une commande simple pour installer n’importe quelle version de PHP : phpenv install <versionDePHP>. Ces versions seront installées dans $HOME/.phpenv/versions/versionDePHP.

Faisons un test en installant PHP 7.4. Il suffit de vérifier la dernière version stable sur le site de PHP puis :

phpenv install 7.4.18

Si vous avez besoin d’installer des extensions, vous pouvez remplacer la commande précédente par :

PHP_BUILD_CONFIGURE_OPTS="--with-pdo-mysql --with-curl --with-openssl --enable-soap --enable-debug" phpenv install 7.4.18

Vous devez évidemment remplacer le contenu de PHP_BUILD_CONFIGURE_OPTS par ce que vous voulez. Par contre, je ne suis pas sûr de ce qui est accepté ou non. Il n’était déjà pas évident de trouver cette option ; rien dans le « Readme » du projet, il faut fouiller dans le dépôt pour trouver ce genre d’information.

Il est possible que l’installation échoue et que vous obteniez un message comme celui-ci :

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: error: Cannot find libtidy
-----------------------------------------

The full Log is available at '/tmp/php-build.7.4.18.20210701122629.log'.
[Warn]: Aborting build.

Dans ce cas, vous devez installer les dépendances nécessaires sur votre distribution. Pour l’exemple cité, sur Manjaro, sudo pacman -S tidy.

Après chaque installation d’une nouvelle version, phpenv recommande d’exécuter la commande suivante :

phpenv rehash

Utilisation

Au sein d’un répertoire

Il suffit de se rendre dans le répertoire où on souhaite installer Prestashop puis de spécifier la version de PHP que l’on souhaite utiliser localement :

cd ~/Sites/prestashop.test/
phpenv local 7.4.18

Si vous avez installé l’extension phpenv-aliases, vous pouvez utiliser :

phpenv local 7.4

Vous verrez un nouveau fichier nommé .php-version dans le répertoire. Il permet à phpenv de connaître la version de PHP à utiliser pour l’ensemble de ce répertoire. Vous pouvez facilement vérifier si ça fonctionne correctement :

cd ~/Sites/prestashop.test/htdocs
phpenv version
#output#7.4.18 (set by /home/username/Sites/prestashop.test/.php-version)

Au sein du shell

Il est également possible de définir une version de PHP au niveau du shell :

phpenv shell 7.4.18

Cette commande va créer une variable d’environnement définissant la version de PHP à utiliser dans vos shells. Il vous faudra donc penser à enlever cette variable si vous souhaitez revenir à la version de PHP du système :

phpenv shell --unset

Globalement

Il est également possible de définir une autre version de PHP globalement :

phpenv global 7.4.18

Pour revenir à la version du système, vous pouvez utiliser :

phpenv global system

Configurer le serveur virtuel

On pourrait penser que les précédentes étapes suffisent pour utiliser une autre version de PHP. Cependant, si vous placez un fichier contenant phpinfo(); dans le répertoire, vous verrez que votre serveur virtuel utilise toujours la version PHP du système. Il reste donc quelques étapes pour que tout soit fonctionnel.

Si vous ne savez pas mettre en place un serveur virtuel, vous pouvez consulter mon précédent article : installer LAMP sur Manjaro.

Si vous êtes un minimum familier avec la configuration d’Apache, ces étapes ne sont pas très compliquées.

Activer les modules nécessaires

Pour commencer, il faut s’assurer que les modules mod_proxy et mod_proxy_fcgi d’Apache sont activés :

sudo nano /etc/httpd/conf/httpd.conf

Dé-commenter :

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Pour que les modifications prennent effet, il faut redémarrer Apache :

sudo systemctl restart httpd

Modifier la configuration d’un serveur virtuel

Ensuite, il faut modifier la configuration du serveur virtuel où l’on souhaite utiliser une autre version de PHP :

sudo nano /etc/httpd/conf/vhosts/prestashop.test

Dans ce fichier, il faut rajouter deux directives pour utiliser un proxy pour tous les fichiers PHP :

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/srv/http/prestashop.test/htdocs/$1

Ici, il y a plusieurs choses à penser :

  • si vous avez configuré http (:80) et https (:443), il faut placer ces directives dans les deux configuration,
  • /srv/http/prestashop.test/htdocs/ correspond à la racine de votre document, ce que vous avez renseigné dans DocumentRoot
  • si php-fpm écoute un autre port, il faut remplacer :9000.

Pour que les modifications prennent effet, il faut redémarrer Apache :

sudo systemctl restart httpd

Gestion des droits et configuration de php-fpm

L’idée avec phpenv est de pouvoir installer différentes versions de PHP par utilisateur. Il n’est donc pas question d’installer ces versions en utilisant sudo. Cependant, le serveur a lui aussi besoin des droits pour accéder au site. Nous allons donc définir les droits d’accès. Personnellement, je préfère utiliser les ACL :

cd ~/Sites/prestashop.test/
sudo setfacl -Rdm user:votreNom:rwx .
sudo setfacl -Rm user:votreNom:rwx .
sudo setfacl -Rdm user:http:rwx .
sudo setfacl -Rm user:http:rwx .

Avant de démarrer php-fpm, il nous reste à modifier légèrement sa configuration pour lui indiquer les utilisateurs à écouter.

nano ~/.phpenv/versions/7.4.18/etc/php-fpm.d/www.conf

Vers la ligne 54 – au moment où je rédige – il faut remplacer :

;listen.acl_users =

Par :

listen.acl_users = votreNom,http

Enfin, il ne reste plus qu’à démarrer php-fpm :

sh ~/.phpenv/versions/7.4.18/etc/init.d/php-fpm start

Vous pouvez vérifier que tout fonctionne correctement à l’aide de phpinfo :

nano ~/Sites/prestashop.test/htdocs/phpinfo.php

Et insérer :

<?php
phpinfo();

Si vous vous rendez sur https://www.prestashop.test/phpinfo.php, vous devriez voir :

PHP Version 7.4.18

À noter, si php-fpm n’est pas démarré, vous ne pourrez pas accéder au site puisque le proxy nécessite ce service.

Conclusion

Finalement, la procédure pour utiliser plusieurs versions de PHP n’est pas si compliquée. La documentation des deux outils suffit pour obtenir une autre version de PHP facilement. Là où ça se complique un peu, c’est la partie où il faut configurer le serveur virtuel. Ceci dit, si vous savez déjà en configurer un, ce n’est pas si terrible.

Vous bénéficier maintenant d’un environnement de développement PHP plus complet. Vous pourrez maintenant utiliser d’autres versions que celle installée sur votre système. Une autre solution serait de passer par un outil comme Docker. Cependant, si vous êtes plus familier avec LAMP, vous savez désormais comment faire.

Aucun commentaire sur “Installer et utiliser plusieurs versions de PHP” pour le moment.

S'abonner aux commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *