I. L’enfer des dépendances▲
I-A. La roadmap de PHP▲
À l’heure où j’écris cet article, fin mai 2020, voici la roadmap de PHPConsulter la roadmap actuelle de PHP :
La version 8 étant attendue vers la fin de l’année, l’heure est plutôt calme, nous ne pouvons utiliser que trois versions de PHP :
- la version 7.2, même s’il n’existe plus que des mises à jour de sécurité, elle reste présente en production ;
- la version 7.3 ;
- la version 7.4.
Quand vous aurez bu votre café :
-
vous disposerez de ces trois versions de PHP, chacune d’entre elles sera déployée avec deux variantes :
- une compilation avec les extensions par défaut,
- une seconde avec XDebug en plus des extensions par défaut ;
- grâce à home brew, l’outil composer se basera sur la version de phpbrew ;
- votre IDE sera correctement configuré pour chaque version de PHP.
La solution, c’est le logiciel PhpBrew qui va nous l’apporter. Les adeptes du ristretto peuvent passer au chapitre 2.
I-B. Il était une fois…▲
Il était une fois un client qui appelait pour nous faire part d’un bogue. La hotline a réussi à reproduire le code et nous informe qu’il ne survient que sur les environnements déployés avec PHP7.4.
Du coup, le service de test a reçu pour mission de développer un test fonctionnel mettant en évidence le bug. Un développeur s’y attelle, il fait craquer ses doigts et lance sa machine virtuelle avec PHP7.4. Le voilà à coder son test. Une demi-heure plus tard, c’est fait. Il lance la suite de tests, tout marche, sauf le nouveau test qui retourne un échec. Parfait ! Le développeur pousse son code sur le dépôt de développement et ô surprise, tout explose. Bon, j’exagère un peu. En fait, nos tests d’intégration exécutés par Travis-CITravis-CI montrent que son test plante en PHP7.3 ! La hotline avait dit que cela fonctionnait en 7.3 ! Au pire, le test devrait indiquer un échec (failure), mais sûrement pas une erreur !
Mais que s’est-il donc passé ? Est-ce que la hotline se serait trompée ? Un test manuel aura vite démontré que nous avions tort de douter d’eux. Ça marche en PHP7.3. Alors comment cela se fait-il ?
En fait, le développeur a déployé l’application sous PHP 7.4, notre gestionnaire de dépendances, composerComposer, gestionnaire de dépendances a sélectionné la dernière version de PHPUnit compatible, c’est-à-dire la 9. Ensuite, PHPStorm, son IDE, lui a suggéré la méthode « getMethod » pour un mock de son test. Résultat ? Le test est simplifié grâce à cette nouvelle méthode et, en plus, le test marchait. Du moins, en PHP7.4…
Mais PHPUnit9 n’est pas compatible avec PHP7.3 ! Résultat ? Dans un environnement en PHP7.3, composer ne déploie que la version 8 de PHPUnit, une version où la méthode « getMethod » n’existait pas encore. Le déploiement sur les serveurs de qualification n’a pas planté, mais le test si ! D’ailleurs, il ne retourne pas un échec, il provoque carrément une erreur. Comment notre développeur aurait-il pu éviter cela ? En redéployant son application sous PHP7.3 et avant d’exécuter son test sous PHP7.3, or il ne pouvait pas, car pour faire tourner PHP7.4, il utilisait une machine virtuelle. Tout aurait été plus simple pour lui, si nous avions documenté le passage d’une version de PHP à une autre sur les environnements de développement. Il n’aurait pas eu recours à l’artillerie lourde, à la machine virtuelle. C’est tout l’objet de ce tutoriel qui reprend une procédure interne pour installer et utiliser PhpBrew.
I-C. Une solution pour le développement▲
Notez bien que PhpBrew reste une solution pour un environnement de développement.
En production, les hébergeurs vont veiller à ce que le serveur web, Apache, Nginx, charge la bonne version du module PHP. En environnement, il existe trois méthodes générales.
Extensions : on peut utiliser des extensions différentes et affecter un module à une version spécifique. C’était le cas, il y a bientôt une vingtaine d’années, on affectait le module apache/php3 aux fichiers d’extensions php3 et le module apache/php4 aux fichiers d’extension php. Cette méthode désuète n’a heureusement plus cours aujourd’hui.
Variables d’environnement : certains hébergeurs utilisent Cpanel ou une solution maison pour que le serveur charge telle ou telle version du module PHP en fonction d’un paramétrage de leur client. Ce genre de solution leur permet d’offrir du PHP7.2 à certains clients quand d’autres préféreront la version 7.4.
VirtualHost : enfin, via l’hôte virtuel, un administrateur peut définir une certaine version du module PHP pour un site web et une autre version pour un autre site web. Cette solution est particulièrement mise en œuvre sur les serveurs dédiés à l’Intranet d’une entreprise. Par exemple, sur le même serveur Apache, on fait tourner l’application RH avec le module Apache-PHP7.2 et l’application Mantis en Apache-PHP7.4.
Je vois encore quelques développeurs se creuser la tête pour configurer un serveur Apache sur leur environnement de développement. N’oubliez pas c’est désormais inutile. Depuis la version 5.4, PHP intègre un serveur intégréDocumentation sur le serveur intégré dans PHP. Si ce serveur ne peut être utilisé en production, il est parfait pour le développement.
php -S localhost:8000
II. Installation de PhpBrew▲
II-A. Prérequis à l’installation▲
L’installation de PhpBrew est relativement facile, même s’il n’existe pas encore de paquets sous Linux. Voici les prérequis :
- PHP5.3+ (pour la version minimale, évidemment, si vous avez PHP7, ça va très bien) ;
- bz2 (pour décompresser les phar) ;
- curl (pour télécharger les paquets) ;
- gcc, binutils, autoconf, libxml, zlib, readline (pour compiler).
Le plus complexe est d’installer les prérequis, alors pour vous simplifier la tâche, voici les paquets indispensables, distribution par distribution.
apt-get install build-essential libbz2-dev libreadline-dev libsqlite3-dev libssl-dev libxml2-dev libxslt-dev php-cli php-bz2 pkg-config
apt install php7.3 php7.3-common php7.3-cli php7.3-fpm build-essential autoconf automake autotools-dev re2c libxml2 libxml2-dev libssl-dev openssl gettext libicu-dev libmcrypt-dev libmcrypt4 \
libmhash-dev libmhash2 libfreetype6 libfreetype6-dev libgd-dev libgd3 libpng-dev libpng16-16 libjpeg-dev libxpm4 libltdl7 libltdl-dev libreadline-dev php7.3-bz2 libbz2-dev libcurl4-gnutls-dev libzip-dev
yum install make gcc gcc-c++ kernel-devel
yum install php php-bz2 php-devel php-pear bzip2-devel yum-utils libmcrypt-devel libpqxx-devel libxslt-devel pcre-devel libcurl-devel libgsasl-devel openldap-devel
yum-builddep php
yum install httpd-devel
sudo zypper in
php7 php7-bz2 php7-phar php7-curl php7-openssl
sudo zypper in
-t pattern devel_basis
sudo zypper in
libxml2-devel libopenssl-devel libbz2-devel libmcrypt-devel libxslt-devel
Avec le temps, cette liste de prérequis pourrait évoluer. Voici la liste des prérequisListe officielle des prérequis pour installer PhpBrew maintenue à jour par l’équipe de PhpBrew.
II-B. Installation de PhpBrew▲
Pour l’installation, vous ne devrez poser votre tasse que quelques instants pour saisir les quelques lignes de commandes :
- Ligne 1 : elle télécharge le script ;
- Ligne 2 : elle le rend exécutable ;
- Ligne 3 : elle le déplace vers le répertoire adéquat pour l’appeler depuis n’importe quel répertoire.
2.
3.
4.
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/phpbrew
phpbrew init
Néanmoins, je vous déconseille de suivre aveuglément la documentation officielle pour l’étape suivante si vous ne voulez pas casser l’apparence de votre terminal.
echo
"[[ -e ~/.phpbrew/bashrc ]] &&
source ~/.phpbrew/bashrc" >>
~/.bashrc
source ~/.phpbrew/bashrc
PhpBrew a tendance à modifier l’apparence de votre terminal pour afficher la version de PHP en cours. L’illustration suivante montre la différence !
J’ai fait l’appel au fichier de configuration de PhpBrew au début de mon fichier de configuration bash pour charger les variables d’environnement. Comme je n’ai pas besoin de savoir tout le temps quelle est la version actuelle de PHP, la suite de mon script écrase les modifications faites pour la présentation. À vous de choisir ce que vous préférez !
III. Utilisation de PhpBrew▲
III-A. Quelques commandes▲
Voilà PhpBrew est installé, vous allez désormais découvrir qu’il est très simple de compiler une version précise de PHP, de lister les versions disponibles et leurs variantes et, l’essentiel, de basculer d’une version à l’autre.
III-A-1. Mettre à jour la liste des versions connues▲
Pour éviter de constamment interroger les serveurs de PHP.net, PhpBrew met en cache les versions de PHP qu’il sait disponibles. Pour mettre à jour ce cache, il suffit d’exécuter la commande suivante. Vous ne devriez utiliser cette commande que lorsqu’une nouvelle version de PHP est publiée.
phpbrew update
III-A-2. Lister les versions de PHP connues▲
L’argument « known » permet de lister les versions de PHP que connaît PhpBrew. Ce ne sont pas les versions installées, mais bien les versions de PHP connues. Je ne dis pas « existantes », car si vous n’avez pas mis à jour PhpBrew, il peut ne pas connaître les toutes dernières versions publiées.
phpbrew known
III-A-3. Lister les variantes, les extensions disponibles▲
L’argument « variants » permet de lister les variantes, les extensions disponibles pour construire un nouveau « build » PHP.
phpbrew variants
En prime, cette commande vous liste à la fin quelques astuces pour créer un build avec quelques variantes. Nous reviendrons sur ce point un peu plus loin.
III-A-4. Construire une nouvelle version de PHP▲
La commande « phpbrew install » vous permet d’installer une version de PHP. Sans autre argument que le numéro de version, Phpbrew compilera la nouvelle version avec les extensions par défaut, les extensions les plus courantes.
phpbrew install 7.4.6
Vous pouvez également spécifier les extensions que vous souhaitez et préciser un alias.
phpbrew install 7.3.18 +debug
as php-7.3.18-debug
Les installations sont assez longues, car PhpBrew les compile complètement.
III-A-5. Lister les versions de PHP installées▲
Avec l’argument « list », la commande phpbrew vous retourne les versions installées. En mode verbeux, avec l’option « -v », cette commande vous liste aussi les extensions installées sur chaque version.
phpbrew list
phpbrew list -v
III-A-6. Changer de version▲
L’argument « switch » permet de basculer d’une version de PHP à une autre
phpbrew switch version
phpbrew switch php-7.4.6
Il suffit de remplacer version, par l’un des résultats de la commande « phpbrew list ».
III-A-7. Exécuter une commande sur chaque version installée▲
La commande « phpbrew each » permet d’exécuter une commande sur chacune des versions installées. Nous verrons un usage pertinent à la fin du tutoriel. Pour le moment, contentons-nous d’un exemple très simple, mais peu utile :
phpbrew each php -v
III-B. Quelques exemples d’utilisation de PhpBrew▲
III-B-1. Démarrage, changement de version, arrêt▲
Pour vérifier la version de PHP en cours, nous allons utiliser la commande « php -v ». Ainsi, nous pouvons constater que :
- Ligne 1 : j’utilise l’exécutable PHP standard de ma distribution Debbie (Linux Mint LMDE basée sur une Debian Buster) ;
- Ligne 2 : je choisis une version précédemment installée : la 7.4.6 ;
- Ligne 4 : je choisis cette version 7.3.18 avec l’extension debug ;
- Ligne 6 : en arrêtant phpbrew, je reviens à la version de PHP fournie par ma distribution.
2.
3.
4.
5.
6.
7.
php -v
phpbrew switch php-7.4.6
php -v
phpbrew switch php-7.3.18-debug
php -v
phpbrew off
php -v
III-B-2. Le piège des extensions supplémentaires▲
Parfois, les développeurs ont besoin d’une extension en particulier en plus des versions par défaut, alors ils exécutent la commande ci-dessous :
phpbrew install 7.3.18 +debug
as 7.3.18-debug
La capture d’écran vous démontre que cette commande ne rajoute pas l’extension debug. Enfin, pas tout à fait ! En réalité, elle remplace toutes les extensions par défaut par l’extension debug ! En d’autres termes, cette version de PHP n’a plus les extensions par défaut, elle ne dispose que d’une seule extension : debug. Très limitatif !
Pour résoudre ce problème, vous avez deux solutions. La plus simple consiste à construire un build en précisant que vous voulez les extensions par défaut « +default » et l’extension debug « +debug ».
phpbrew install 7.4.6 +default +debug
as php-7.4.6-debug
phpbrew list -v
Autre solution, les héritages ! Commençons par installer la version 7.3.18 avec les extensions par défaut. Puis installons une version qui hérite de la version par défaut, mais à laquelle on ajoute « debug ».
phpbrew install 7.3.18 as php-7.3.18-default
phpbrew install 7.3.18 like php-7.3.18-default as php-7.3.18-debug +debug
phpbrew list -v
IV. Création de votre environnement de développement▲
IV-A. Installer toutes les versions de production et leur variante avec debug et XDebug▲
Pour ceux qui ont encore un peu de café à siroter dans leur tasse, nous allons installer les trois versions en cours de PHP ainsi que leurs trois variantes avec debug et surtout l’extension Zend XDebug, soit six installations en quelques lignes de commande.
Tout d’abord, on liste les dernières versions disponibles.
Nous allons nous limiter aux versions qui peuvent encore se trouver en production. Nous n’installerons donc pas les versions obsolètes de PHP. Seules restent les versions 7.2.31, 7.3.18 et 7.4.6 à installer, du moins au moment où je rédige cet article (mai 2020).
Grâce à PhpBrew, il est désormais facile de déployer ces trois versions, avec pour chacune deux variantes :
- les extensions par défaut seulement ;
- les extensions par défaut et l’extension debug.
phpbrew install 7.2.31 as php-7.2.31-default
phpbrew install 7.2.31 like php-7.2.31-default +debug
as php-7.2.31-debug
phpbrew install 7.3.18 as php-7.3.18-default
phpbrew install 7.3.18 like php-7.3.18-default +debug
as php-7.3.18-debug
phpbrew install 7.4.6 as php-7.4.6-default
phpbrew install 7.4.6 like php-7.4.6-default +debug
as php-7.4.6-debug
phpbrew list -v
Et voilà, avec un seul copier-coller et quelques minutes de compilation, votre environnement de développement dispose de toutes les versions qu’on peut trouver en production (default) ou en environnement de qualification (debug) !
Attention, à ce stade vous avez installé l’extension debug, ne confondez pas avec l’extension XDebug.
Nous allons désormais installer pour chaque version *debug, l’extension XDebug de Zend. Pour ce faire nous allons :
- Ligne 1 : basculer sur une version debug ;
- Ligne 2 : vérifier que XDebug n’est pas installé ;
- Ligne 3 : installer l’extension Xdebug ;
- Ligne 4 : vérifier que XDebug est installé ;
- Lignes suivantes : on répète ensuite le processus pour les versions 7.3.12-debug et 7.4.6-debug en vérifiant à chaque fois le résultat.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
phpbrew switch php-7.2.31-debug
php -v
phpbrew ext install xdebug stable
php -v
phpbrew switch php-7.3.12-debug
php -v
phpbrew ext install xdebug stable
php -v
phpbrew switch php-7.4.6-debug
php -v
phpbrew ext install xdebug stable
php -v
IV-B. Utiliser composer avec PhpBrew▲
ComposerSite web officiel de composer est un excellent gestionnaire de dépendances pour PHP. Si vous ne l’utilisez pas, vous pouvez passer ce chapitre. Sinon la commande suivante va vous montrer que l’installation par défaut de composer n’utilise pas la version de PHP activée par PhpBrew, mais celle de votre distribution.
composer diagnose
Comme vous le voyez dans le résultat, le chemin utilisé pour appeler PHP est celui par défaut.
La commande suivante est plus précise :
composer diagnose |
grep PHP
Il existait une commande permettant d’installer directement composer via PhpBrew, mais elle a été retirée de l’application. Désormais, il est nécessaire de passer par Brew. Commencez par installer le paquet brew en fonction de votre distribution.
Sous Debian, Ubuntu et Mint, il s’agit de la commande suivante. Pour les autres distributions, veuillez vous reporter à la documentation d’installation officielleDocumentation d'installation de LinuxBrew.
sudo apt install linuxbrew-wrapper
Pensez à bien rajouter le répertoire « /home/linuxbrew/.linuxbrew/bin/ » à votre PATH comme indiqué à la fin des commentaires qui apparaissent à l’écran à la fin de l’installation de brew.
Installez ensuite composer via brew :
brew install composer
Pensez à supprimer la version de composer de votre distribution et à redémarrer votre terminal pour être certain que votre PATH se met bien à jour.
Nous allons désormais basculer sur une version de PHP avec PhpBrew et vérifier que composer la prend bien en compte.
2.
3.
phpbrew switch php-7.4.6-debug
php -v
composer diagnose |
grep PHP
phpbrew each composer |
grep PHP
IV-C. Configurer votre IDE : un exemple avec PhpStorm▲
Dans ce paragraphe, nous allons nous pencher sur votre IDE et découvrir comment :
- configurer chacune de nos versions de PHP comme interpréteur ;
- déclarer le chemin de composer ;
- créer un processus pour démarrer un serveur PHP et vérifier via votre navigateur le résultat de la fonction phpversion()Description de la fonction phpversion.
IV-C-1. Configuration de nos versions de PHP▲
- Ouvrez la fenêtre des paramétrages (CTRL+ALT+S) ou sélectionnez « Files » puis « Settings » dans le menu principal.
-
Allez dans la rubrique « Languages & Frameworks / PHP » comme dans la capture d’écran ci-dessous.
-
Dans la liste déroulante « PHP Language Level », sélectionnez « 7.4 ».
-
Pressez « MAJ+Entrée » ou cliquez sur le bouton « … » à droite de « Client Interpreter ».
-
La fenêtre nommée « CLI Interpreters » s’ouvre,
-
Cliquez sur le « + » et sélectionnez « Other locals ».
-
Nommez-la avec un nom évocateur, par exemple « PHP 7.4.6 avec XDebug ».
-
Dans la rubrique « PHP Executable », allez rechercher la compilation de PHP correspondante. Pour moi, il s’agit de : /home/alexandre/.phpbrew/php/php-7.4.6-debug/bin/php.
-
PHPStorm va détecter la version de PHP et son fichier de configuration correspondant, vous remarquerez dans la capture d’écran ci-dessous qu’il a bien détecté l’extension XDebug.
- Cliquez sur « Apply » et répétez les opérations 7 à 10 pour chacune des six versions.
L’illustration suivante vous présente ce que vous devriez obtenir à cette étape :
IV-C-2. Configuration de composer▲
- Ouvrez la fenêtre des paramétrages (CTRL+ALT+S) ou sélectionnez « Files » puis « Settings » dans le menu principal.
- Allez dans la rubrique « Languages & Frameworks / PHP / Composer ».
- Cochez la case « composer.phar ».
- Cochez la case « Download composer.phar from getcomposer.org ».
- Sélectionnez « Default project Interpreter » comme interpréteur PHP.
- Cliquez sur « OK ».
Astuce : pour éviter que PhpStorm n’indexe le contenu de composer.phar, dans la liste des fichiers, faites un clic droit dessus et sélectionnez « exclude phar from project ».
IV-C-3. Testons tout cela !▲
IV-C-3-a. Testons composer▲
Testons « composer » : via le menu principal, sélectionnez « Tools / Composer / Diagnose » et vérifiez dans le journal composer qu’il affiche la bonne version de composer, la bonne version de PHP et vérifiez son chemin.
À la rédaction de ce document, PhpStorm télécharge par erreur la version 2 de composer. Or cette version est encore en phase de développement. Cela va poser pas mal de soucis.
Pour corriger cela, sélectionnez dans le menu principal « Tools / Composer / Self-Update ». En se mettant à jour, Composer revient à une version stable.
IV-C-3-b. Créons deux scripts PHP pour tester deux interpréteurs PHP différents▲
Créons un nouveau projet et créons un fichier « version.php » dont le contenu se contentera d’afficher le numéro de version de PHP.
<?php
echo phpversion();
Ensuite, sélectionnez dans le menu « Run / Edit configurations », nous créons deux « PHP Scripts » qui exécutent le fichier version.php.
La seule différence entre ces deux configurations, c’est le choix de l’interpréteur PHP.
Si vous lancez les deux scripts (ALT+MAJ+F10) ou « Run / Run… », vous verrez que les résultats sont différents, comme attendus.
IV-C-3-c. Lançons simultanément trois serveurs PHP en différentes versions▲
- Sélectionnez dans le menu « Run / Edit configurations ».
- Créez un « Shell Script ».
-
Renseignez les valeurs suivantes :
- Name : « Server PHP 7.4 port 8004 » ;
- Script Path : /home/alexandre/.phpbrew/php/php-7.4.6-default/bin/php ;
- Script Options : -S 127.0.0.1:8004 ;
- Working directory : le répertoire de votre projet ;
- Interpreter Path : laissez ce champ vide !
- Recommencez les étapes précédentes pour une version 7.2 sur le port 8002 et une version 7.3 sur le port 8003.
Vous pouvez exécuter les trois scripts les uns après les autres depuis la liste déroulante des scripts.
Si vous ouvrez votre navigateur sur les trois adresses suivantes, vous verrez que PHP exécute bien votre script sur des serveurs PHP de trois versions différentes.
V. En conclusion▲
Le temps d’un café (ou deux), ce tutoriel vous a permis :
- d’installer plusieurs versions de PHP sous Linux ;
- de basculer d’une version à l’autre à l’aide d’une seule commande ;
- de lier composer à la version de PHP active ;
- de découvrir comment utiliser ces versions dans votre éditeur, ici PhpStorm.
J’espère que cet article vous facilitera la tâche. N’hésitez pas à me faire part de vos remarques.
En complément, vous trouverez ci-dessous les commandes les plus utiles et les sites web des outils cités dans cet article.
V-A. Commandes utiles▲
# Installer une nouvelle version de PHP avec les extensions les plus utiles
phpbrew install 7.4.6 +default +iconv +gettext +intl as php-7.4.6-defaut
# Lister les versions disponibles
phpbrew list
# Lister les versions disponibles et les extensions présentes
phpbrew list -v
# Changer de version
phpbrew switch php-7.4.6-default
#Vérifier que composer est bien interfacé avec phpbrew
phpbrew each composer diagnose |
grep PHP
V-B. Liens utiles▲
- Dépôt Github de PhpBrewDépôt Github de PhpBrew
- Roadmap de PHPRoadmap de PHP
- Le serveur web intégré de PHPDocumentation pour lancer le serveur web intégré à PHP depuis la version 5.4
- Site officiel de composerSite officiel de composer
- Site officiel de LinuxBrewPage dédiée à l'installation de LinuxBrew
- Site officiel de JetBrains développant PhpStormSite officiel de JetBrains développant PhpStorm
- Licence MIT de PhpBrewLicence MIT
Je tiens à remercier ClaudeLELOUPProfil utilisateur de ClaudeLeLoup pour sa relecture orthographique attentive.