====== Plusieurs versions de PHP sous Debian ====== ===== Besoin ===== Je souhaite que différents site hébergés par le même serveur (système) puissent utiliser différentes versions de PHP. De plus, je souhaite utiliser des versions supérieures à celles mises à disposition sur les dépôts officiels de Debian. ===== Solution ===== Cette fiche décrit comment utiliser le dépôt sury.org afin de faire cohabiter plusieurs versions de PHP. ==== Installation des dépôts ==== L'installation peut se faire depuis un compte disposant de droits étendus via //sudo//. Elle se fait via l'exécution d'un [[https://packages.sury.org/php/README.txt|script]] qui déclare le dépôt, installe des paquetages((Fournis pas les dépôt officiels de Debian.)) pré-requis et installe un paquetage((Fourni par sury.org.)) de configuration. Le tout peut se faire à l'aide d'une seule ligne de commande : $ curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x [[https://wiki.debian.org/AdditionalPHPVersions#Adding_the_SURY_Repository|wiki.debian.org]] indique une autre manière plus simple et __générique__ d'installer et configurer le dépôt //sury.org//. NON TESTÉE. ==== Ajouter une version de PHP ==== Partant de là, l'installation de plusieurs versions de PHP se fait de manière standard, via //apt//. Par exemple : $ sudo apt install php8.1 Cette installation peut installer automatiquement le paquetage libapache2-mod-php8.1 qui plantera certains environnement tels //Virtualmin// qui fonctionnent en CGI ou FPM mais pas en //modules// apache. Il suffit alors de désinstaller manuellement ce paquetage : $ sudo apt remove libapache2-mod-php8.1 ==== Ajouter des modules ==== Certains //modules PHP// sont déjà disponibles car pré-compilés dans la version de PHP contenue par le paquetage de base. Il est donc vain de chercher à les installer via des paquetages complémentaires((Ces paquetages n'existent pas :-D)). Pour en connaître la liste : $ php8.1 -m L'ajout d'un ou plusieurs modules à une version de PHP se fait simplement en indiquant la version souhaitée. Par exemple((Configuration standard pour des CMS basiques sous Virtualmin.)) : $ sudo apt install php8.4-cgi php8.4-cli php8.4-common php8.4-fpm php8.4-gd php8.4-imagick php8.4-mbstring php8.4-mysql php8.4-opcache php8.4-phpdbg php8.4-readline php8.4-xml php8.4-zip ===== Mises à jour ===== Les mises à jour des versions de PHP et des modules additionnels ainsi installés se fait alors de la même que pour les paquetage Debian standard. C'est tout l'intérêt d'avoir ajouter les dépôts. Toutefois, certains problèmes peuvent apparaître notamment dans la configuration du dépôt. ==== Clé publique non disponible ==== Source : [[https://forums.raspberrypi.com/viewtopic.php?t=365874|GPG Error Sury]] (en) (raspberrypi.com) Ce problème est signalé lorsqu'on fait une simple mise à jour des paquetages disponibles. # apt-get update ... Err:7 https://packages.sury.org/php bookworm InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743 ... Reading package lists... Done W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packages.sury.org/php bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743 W: Failed to fetch https://packages.sury.org/php/dists/bookworm/InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743 W: Some index files failed to download. They have been ignored, or old ones used instead. # Comme l'indique le message d'avertissement, les paquetages mis à jour via le dépôt //sury.org// ne seront plus mis à jour ! Une technique testée avec succès consiste à : - supprimer le fichier de description du dépôt //sury.org// - relancer le script d'installation du dépôt //sury.org// Soit, dans le cas testé : # cd /etc/apt/sources.list.d/ # mv php.list ~/php.list.back # curl -sSL https://packages.sury.org/php/README.txt | bash -x Il se peut que fichier de configuration du dépôt ne soit pas nommé "php.list". On peut s'en assurer en listant le contenu du répertoire "/etc/apt/sources.list.d/" et adaptant la commande //mv// en conséquence. À partir de là, la mise à jour des paquetages disponibles (apt update) ne doit plus signaler l'erreur indiquée précédemment. === Focus === Concrètement, la déclaration des clés PGP a été modifiée par //sury.org//. La relance du script, installe un nouveau trousseau de clé pour //sury.org// et y fait référence dans la déclaration du dépôt. Dans le cas considéré jusqu'ici : * dans l'ancienne version de //php.list//, on trouve signed-by=/usr/share/keyrings/deb.sury.org-php.gpg * dans la nouvelle version de //php.list//, on trouve signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg ===== Supprimer une version ===== ==== Vérifications ==== Avant de supprimer une version installée, il convient de s'assurer qu'elle n'est pas utilisée : * par un site web * en ligne de commande * par défaut par Apache2 Les deux dernières conditions se vérifient rapidement. Attention, la ligne de commande demande deux vérifications. Pour connaître la version utilisée via un shell : $ php -r "echo phpversion() ;" Pour connaître la version CLI utilisée via un shell((La version de l'interface d'accès à PHP (phpX.Y-cli) peut différer de la version exécutée de PHP (phpX.Y).)) : $ php --version Pour //Apache2// : $ php -c /etc/php/apache2/php.ini -v La vérification de la première dépend de la configuration du serveur((De la manière dont plusieurs sites web hébergés sur le même système peuvent utiliser des versions différentes de PHP.)). === Virtualmin === //Virtualmin// permet d'afficher la liste des serveurs virtuels gérés : //Virtualmin > List Virutal Servers//. Par défaut, les versions de PHP ne sont pas indiquées dans la liste. Il suffit d'adapter la configuration du module ad hoc : //Virtualmin > List Virutal Servers > Modules Config > Columns to show > PHP version//. ==== Adaptations ==== S'il s'avère que la version de PHP que l'on veut supprimer est utilisée, il est possible d'adapter les configurations pour que ce ne soit plus le cas. Évidemment, chacune doit posément évaluer les conséquences de telles adaptations avant de les effectuer. === Ligne de commande === Par défaut, sous Debian 12 avec les dépôts //sury.org//, la version par défaut de PHP est la version la plus élevée installée via le paquetage "//phpX.Y//". La version par défaut utilisée en ligne de commande se modifie à l'aide de la commande //update-alternatives// : update-alternatives --config php === Apache === Je n'ai pas trouvé de règle générale. === Site web === Sous //Virtualmin//, la version de PHP utilisée par un serveur virtuel se modifie dans : //Virtualmin > serveur > Web Configuration > PHP Options > PHP versions//. ==== Suppression ==== === Paquetages installés === dpkg --get-selections | grep phpX.Y où "X.Y" est la version que l'on souhaite supprimer. Cette commande affichera les paquetages PHP ainsi que tout autre paquetage contenant "phpX.Y" dans son nom (par exemple : //libapache2-mod-phpX.Y//). dpkg -l | grep phpX.Y | awk '{print $2}' | xargs -n1 echo devrait fournir le même résultat tout en préparant une suppression générale (voir plus loin). apt list 'phpX.Y*' --installed affichera la liste des paquetages PHP installés pour la version X.Y et indiquera des informations complémentaires telles que la version précise de chaque paquetage. === Désinstallation === Une fois que l'on a la liste des paquetages, on peut les désinstaller un à un : apt remove mon-paquetage ou, si on sait ce qu'on fait apt purge mon-paquetage Si on tient à supprimer (//remove// ou //purge//) d'un seul coup tous les paquetages d'une version de PHP : apt remove --dry-run '^phpX\.Y.*' >>>>>>>>>>>>> pour voir ce que cela fera (dry-run) apt remove '^phpX\.Y.*' L'expression régulière '^phpX\.Y.*' permet un contrôle précis des noms des paquetages qui seront supprimés. Si on veut supprimer (//remove// ou //purge//) tous les paquetages dont le nom mentionne la version de PHP visée((Par exemple, y compris //libapache2-mod-phpX.Y.//)), on reprendra la formule de recherche vue précédemment en modifiant l'action //xargs// : dpkg -l | grep phpX.Y | awk '{print $2}' | xargs -n1 sudo apt remove -y ===== Sources ===== * [[https://wiki.debian.org/AdditionalPHPVersions|Additional PHP versions on Debian | 3rd party integration]] (en) (wiki.debian.org) * [[https://doknet.fr/tssr/exploiter-les-elements-de-linfrastructure-et-assurer-le-support-aux-utilisateurs/exploiter-des-serveurs-linux/tips-tricks-pour-php-et-debian-11/|Tips & tricks pour changer de version de php sur Debian]] * [[https://askubuntu.com/questions/277756/how-do-i-delete-all-packages-which-match-a-certain-pattern|How do I delete all packages which match a certain pattern?]] * [[https://linuxprograms.wordpress.com/tag/dpkg-get-selections/|dpkg tutorial – Package Manager for Ubuntu / Debian]]