Installer et utiliser plusieurs versions de PHP
Pour un projet, j’ai eu besoin d’installer (et d’utiliser) une autre version de PHP que celle installée sur ma distribution. Manjaro utilise PHP 8.0.3 – la dernière version de PHP – et j’avais besoin de PHP 7.4. Je vais vous expliquer comment je m’y suis pris pour pouvoir utiliser plusieurs versions.
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.
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é dansDocumentRoot
- 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.
0 commentaire
Laisser un commentaire