PHPBrew : plusieurs versions de PHP sous Linux

PHPBrew : plusieurs versions de PHP sous Linux

Votre code doit fonctionner sur plusieurs versions de PHP ? Vous migrez une application d’une ancienne vers une nouvelle version de PHP ? Vous développez des bibliothèques ? Alors, vous avez sûrement besoin de faire tourner plusieurs versions de PHP sur votre ordinateur de développement.

Le temps de déguster un bon café, cet article vous explique comment installer avec facilité plusieurs versions de PHP sous Linux et comment passer d’une version à l’autre à l’aide d’une seule commande.

Publié le 18 mai 2020Â

Version PDF Version hors-ligne

À l’heure où j’écris cet article, fin mai 2020, voici la roadmap de PHP Consulter 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 :

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 :

La solution, c’est le logiciel PhpBrew qui va nous l’apporter. Les adeptes du ristretto peuvent passer au chapitre 2.

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-CI Travis-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, composer Composer, 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 .

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.

L’installation de PhpBrew est relativement facile, même s’il n’existe pas encore de paquets sous Linux. Voici les prérequis :

Le plus complexe est d’installer les prérequis, alors pour vous simplifier la tâche, voici les paquets indispensables, distribution par distribution.

Avec le temps, cette liste de prérequis pourrait évoluer. Voici la liste des prérequis Liste officielle des prérequis pour installer PhpBrew maintenue à jour par l’équipe de PhpBrew.

Pour l’installation, vous ne devrez poser votre tasse que quelques instants pour saisir les quelques lignes de commandes :

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.

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 !

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.

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.

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.

L’argument « variants » permet de lister les variantes, les extensions disponibles pour construire un nouveau «  build  » PHP.

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.

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.

Vous pouvez également spécifier les extensions que vous souhaitez et préciser un alias.

Les installations sont assez longues, car PhpBrew les compile complètement.

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.

L’argument « switch » permet de basculer d’une version de PHP à une autre

Il suffit de remplacer version , par l’un des résultats de la commande « phpbrew list ».

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 :

Pour vérifier la version de PHP en cours, nous allons utiliser la commande « php -v ». Ainsi, nous pouvons constater que :

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 :

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 ».

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 ».

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 :

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 :

Composer Site 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.

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 :

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 officielle Documentation d'installation de LinuxBrew .

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 :

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.

Dans ce paragraphe, nous allons nous pencher sur votre IDE et découvrir comment :

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.

L’illustration suivante vous présente ce que vous devriez obtenir à cette étape :

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 ».

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.

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.

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.

Renseignez les valeurs suivantes :

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.

Le temps d’un café (ou deux), ce tutoriel vous a permis :

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.

Je tiens à remercier ClaudeLELOUP Profil utilisateur de ClaudeLeLoup pour sa relecture orthographique attentive.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants :

Recommended articles