Choix version de PHP
Sommaire
Présentation
Cette page a pour objet de présenter un programme permettant le changement des binaires PHP dans le PATH du serveur en fonction de la version désirée.
Contexte
Ce programme est utile lorsque plusieurs versions de PHP sont installées sur un serveur. Par exemple, un serveur web hébergeant plusieurs services PHP-FPM.
Programme
Localisation
Le programme est à déposer à n'importe quel endroit accessible par l'ensemble des utilisateurs concernés.
Il faut ensuite faire en sorte que ce programme soit sourcé lors de son appel. En effet, s'il n'est pas sourcé, les modifications qu'apporte ce programme ne seront valable que lors de son exécution. Afin que les modifications qu'il apporte soient valables lors de l'exécution d'autres programmes, il faut créer un alias set_php_version
qui sourcera automatiquement le programme.
Par exemple, ajouter la ligne suivante dans le fichier /etc/profile.d/sh.local
:
alias set_php_version='. /local/php/set_php_version'
Utilisation
De façon interactive
Simplement appeler le programme sans argument :
set_php_version
Exemple d'utilisation :
[root@myserver ~]# set_php_version Veuillez choisir une version de PHP à utiliser : 1) 7.4.7 2) 5.6.40 Choix : 1 Version de PHP : 7.4.7. Path : /local/php/php-7.4.7/bin Pour retirer les binaires PHP du PATH, utiliser la commande « set_php_version reset » [root@myserver ~|PHP 7.4.7]#
De façon scriptée
Pour utiliser le programme dans un script, il faut impérativement connaître la version de PHP à utiliser au prélable, et qu'elle bien installée sur le serveur en question.
Par ailleurs, il faut que l'alias alias set_php_version='. /local/php/set_php_version'
soit défini. Si l'alias n'est pas défini, il faudra appeler le programme par la commande . /local/php/set_php_version
.
Ainsi, dans le cas où l'alias a bien été défini, pour appeler le programme au travers d'un script, il suffit de préciser la version de PHP en argument.
set_php_version 7.4.7
Exemple :
[root@myserver ~]# set_php_version 7.4.7 Version de PHP : 7.4.7. Path : /local/php/php-7.4.7/bin Pour retirer les binaires PHP du PATH, utiliser la commande « set_php_version reset » [root@myserver ~|PHP 7.4.7]#
Dans tous les cas
Dans tous les cas, pour réinitialiser le PATH à son état d'origine, lancer la commande suivante :
set_php_version reset
Exemple :
[root@myserver ~|PHP 7.4.7]# set_php_version reset Reset du PATH sans les binaires PHP [root@myserver ~]#
Contenu
Le contenu du programme est le suivant :
#!/bin/bash
# Ce programme doit être sourcé pour modifier le PATH
# . set_php_version
declare -A versions
declare -A bin_dirs
get_bin_dirs() {
i=1
for bin_dir in $(find /local/php -type d -name bin 2> /dev/null);
do
version="$($bin_dir/php -v|head -1|awk '{print $2}')"
versions[$i]=$version
bin_dirs[$version]=$bin_dir
((i++))
done
}
pathremove () {
local IFS=':'
local NEWPATH
local DIR
local PATHVARIABLE=${2:-PATH}
for DIR in ${!PATHVARIABLE} ; do
if [ "$DIR" != "$1" ] ; then
NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
fi
done
export ${PATHVARIABLE}="$NEWPATH"
}
pathprepend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}
pathappend () {
pathremove $1 $2
local PATHVARIABLE=${2:-PATH}
export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}
if [ "$#" -eq 0 ];
then
## Récupération des différents dossiers hébergeant les binaires PHP
#########################
get_bin_dirs
## Choix de version PHP
#########################
echo -e "Veuillez choisir une version de PHP à utiliser :\n"
i=1
# On parcourt le tableau des applications
for version in "${versions[@]}"
do
# On affiche une liste numérotéé des versions
echo "$i) $version"
((i++))
done
echo ""
read -p "Choix : " version_choice
echo ""
if [[ $version_choice != "" ]]
then
# On peut choisir la version par son numéro
if [[ $version_choice =~ ^[[:digit:]]+$ ]]
then
if [[ ! -z ${versions[$version_choice]} ]]
then
str_bindir=${bin_dirs[${versions[$version_choice]}]}
str_version=${versions[$version_choice]}
fi
# Ou par la version directement
elif [[ ! -z ${bin_dirs[$version_choice]} ]]
then
str_bindir=${bin_dirs[$version_choice]}
str_version=${version_choice}
fi
fi
elif [ "$#" -eq 1 ];
then
## Récupération des dossifférents dossiers hébergeant les binaires PHP
#########################
get_bin_dirs
if [[ ! -z ${bin_dirs[$1]} ]]
then
str_bindir=${bin_dirs[$1]}
str_version=$1
elif [[ $1 == "reset" ]]
then
echo "Reset du PATH sans les binaires PHP"
for dir in ${bin_dirs[*]}
do
pathremove "${dir}"
done
if [[ ! -z $oldPS1 ]]
then
export PS1=$oldPS1
unset oldPS1
else
PS1="[\u@\h \W]\\$ "
fi
fi
else
echo "Nombre de paramètres attendus : 1"
fi
if [[ -z $str_bindir ]]
then
if [[ $1 != "reset" ]]
then
echo "Choix de version invalide !"
get_bin_dirs
echo "Versions disponibles : "${!bin_dirs[*]}
fi
else
echo -e "Version de PHP : $str_version. Path : $str_bindir"
echo -e "Pour retirer les binaires PHP du PATH, utiliser la commande « set_php_version reset »"
for dir in ${bin_dirs[*]}
do
pathremove "${dir}"
done
pathprepend ${str_bindir}
if [[ -z $oldPS1 ]]
then
oldPS1=$PS1
fi
export PS1="[\u@\h \w|\[\033[0;31m\]PHP ${str_version}\[\033[0m\]]\\$ "
fi
unset version versions str_bindir bin_dir bin_dirs pathremove pathprepend pathappend get_bin_dirs version_choice str_version