Choix version de PHP

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 :

Putty icon.png Console SSH

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 iversion in "${!versions[@]}"
	do
		# On affiche une liste numérotée des versions
		echo "$i)  ${versions[${i}]}"
		((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