momh

Faire cohabiter plusieurs versions de PHP sous Debian

Surtout par curiosité, je me suis penché sur la possibilité de faire cohabiter plusieurs versions de PHP sur ma Debian Bullseye et surtout sur la façon de basculer aisément de l’une à l’autre.

Installation

Pour installer plusieurs versions de PHP conjointement, il faut ajouter le dépôt Sury :

sudo apt update
sudo apt -y install apt-transport-https lsb-release ca-certificates curl
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update

De là, il est possible d’installer diverses versions de PHP et de ses modules ; ainsi, sous Bullseye, je me vois proposer les versions 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0 et 8.1 :

apt search php | grep "php[0-9]\.[0-9]/"
[...]
php5.6/bullseye 5.6.40-57+0~20211119.60+debian11~1.gbp8a9bd1 all
php7.0/bullseye 7.0.33-57+0~20211119.61+debian11~1.gbp5d8ba5 all
php7.1/bullseye 7.1.33-44+0~20211119.61+debian11~1.gbp448fbe all
php7.2/bullseye 7.2.34-28+0~20211119.67+debian11~1.gbpf24e81 all
php7.3/bullseye 7.3.33-1+0~20211119.91+debian11~1.gbp618351 all
php7.4/stable-security,now 7.4.28-1+deb11u1 all [installé, pouvant être supprimé automatiquement]
php8.0/bullseye 8.0.16-1+0~20220221.30+debian11~1.gbp8b91a5 all
php8.1/bullseye,now 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 all  [installé, automatique]

Changer facilement de version de PHP

Afin de faciliter le basculement d’une version à une autre, j’ai compilé différentes sources pour finalement produire un petit script, très certainement imparfait, qui permet de choisir de manière interactive parmi les versions de PHP installées celle à utiliser.

touch ~/bin/php-switch
chmod +x ~/bin/php-switch
nano ~/bin/php-switch
#!/bin/bash
# based on https://askubuntu.com/a/883140
# and on https://stackoverflow.com/a/68905711

# Déterminer la version de PHP actuellement utilisée par Apache
VAR=$(ls /etc/apache2/mods-enabled/php*)
IFS=' ' read -r -a array <<< "$VAR"
array[0]=${array[0]#*php}
array[0]=${array[0]%.conf}
OLDVERSION=${array[0]}

echo "La version de PHP actuellement utilisée est la" $OLDVERSION.
echo "Liste des versions de PHP disponibles :"

# Lister les versions de PHP installées
RAWPOSSIBILITIES=$(update-alternatives --list php | sed 's/.*\(...\)/\1/')
POSSIBILITIES=($RAWPOSSIBILITIES)     

# Demander la version de PHP à activer
PS3='Choisissez la version de PHP à activer : '
select opt in "${POSSIBILITIES[@]}" "Annuler"; do
    case "$REPLY" in
        $((${#POSSIBILITIES[@]}+1))) echo "Salut!"; exit;;
    esac
    [ $REPLY -gt $((${#POSSIBILITIES[@]}+1)) -o $REPLY -lt 1 ] && echo "Choix invalide" || break
done

echo "Activer la version ${POSSIBILITIES[(($REPLY-1))]} ? Entrée pour valider, Ctrl-C pour annuler."
read x
# On reconfigure Apache
sudo a2dismod php${OLDVERSION}
sudo a2enmod php${POSSIBILITIES[(($REPLY-1))]}
# On met à jour la version par défaut
sudo update-alternatives --set php /usr/bin/php${POSSIBILITIES[(($REPLY-1))]}
sudo update-alternatives --set phar /usr/bin/phar${POSSIBILITIES[(($REPLY-1))]}
sudo update-alternatives --set phar.phar /usr/bin/phar.phar${POSSIBILITIES[(($REPLY-1))]}  
# On relance le service Apache
sudo systemctl restart apache2