Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🐘 PHP en 2026, factuellement

Un petit éléphant rond se tient sur l'un des plateaux d'une grande balance, et sur l'autre plateau repose une pile bien rangée de documents couverts de graphiques ; la balance est à l'équilibre

Vous avez entendu pas mal de blagues sur PHP. Mais vous l’avez aussi vu dans de nombreuses offres d’emploi, dans la stack technique d’une entreprise respectable, dans le CMS d’un site qui n’est jamais en panne et qui rĂ©pond vite
 Et vous vous demandez quel sens donner Ă  tout ça. Qui croire ? Les PHP haters, ou les fanboys de PHP ?

Ce livre est lĂ  pour donner du factuel, et vous permettre de vous faire une opinion sur PHP tel qu’il est, pour savoir s’il est adaptĂ© Ă  votre projet, votre entreprise, vos envies.

Vous verrez beaucoup de chiffres et de graphiques. Chaque Ă©lĂ©ment chiffrĂ© est sourcĂ© et datĂ© en annexe. Les comparaisons sont factuelles ; aucune n’est Ă©cartĂ©e parce qu’elle mettrait PHP dans une situation inconfortable.

Comptez entre quatre-vingt-dix minutes et deux heures, et l’opinion que vous emporterez sera la vître.

Comment lire ce livre

On vous demande de prendre PHP au sĂ©rieux, et vous vous en passeriez bien. Le langage a trente ans, on l’associe au pire code qu’on vous ait jamais mis sous les yeux, et personne n’en parle dans les confĂ©rences que vous suivez. Il revient pourtant sans cesse : dans la pile technique d’une entreprise que vous respectez, dans les offres d’emploi, derriĂšre un site qui encaisse plus de trafic que le vĂŽtre. J’ai Ă©crit ce livre pour rĂ©gler cette contradiction avec des preuves plutĂŽt qu’avec de l’enthousiasme.

Chaque chiffre de ce livre a une source et une date, et l’annexe les recense pour que vous puissiez vĂ©rifier chacun d’eux. Un nombre dans le texte est suivi de sa provenance et de sa date, entre parenthĂšses. Un chiffre de fournisseur, une Ă©tude de cas auto-dĂ©clarĂ©e ou un benchmark synthĂ©tique sont signalĂ©s comme tels dans la phrase mĂȘme oĂč ils apparaissent, et quand je ne sais pas, je le dis. Vous ne devriez jamais avoir Ă  vous demander si une phrase Ă©nonce un fait ou un souhait.

Pourquoi le doute est raisonnable

La rĂ©putation a Ă©tĂ© mĂ©ritĂ©e. Pendant sa premiĂšre dĂ©cennie, PHP a Ă©tĂ© permissif jusqu’à la faute : les variables surgissaient de nulle part, "abc" == 0 valait vrai, les erreurs s’imprimaient dans la page et l’exĂ©cution continuait, les requĂȘtes vers la base de donnĂ©es se bricolaient par concatĂ©nation de chaĂźnes, et la bibliothĂšque standard grossissait une fonction Ă  la fois, sous le nom que son auteur prĂ©fĂ©rait cette semaine-lĂ . Une gĂ©nĂ©ration a appris Ă  programmer sur ce PHP-lĂ  et en a Ă©crit Ă©normĂ©ment, et une bonne partie de ce code tourne encore. L’essentiel de ce qu’on vous a montrĂ© sous l’étiquette « PHP » date de cette pĂ©riode.

Le langage que vous Ă©valueriez aujourd’hui est un autre objet. PHP 7 (2015) a reconstruit le moteur et ajoutĂ© les dĂ©clarations de types scalaires. PHP 8 (2020) a apportĂ© les types union, match, les arguments nommĂ©s, les attributs, les Ă©numĂ©rations, les propriĂ©tĂ©s readonly, les callables de premiĂšre classe et un compilateur JIT, et il a appris Ă  l’interprĂ©teur Ă  lever une exception lĂ  oĂč il devinait. Une version est sortie chaque annĂ©e depuis, fin novembre ou dĂ©but dĂ©cembre. La PHP Foundation salarie des dĂ©veloppeurs du cƓur depuis 2021, le gestionnaire de paquets est universel, et deux analyseurs statiques vous donnent l’essentiel de ce qu’un compilateur vous donnerait. La syntaxe actuelle est dans Le langage en 2026, et les gens qui la publient sont dans Gouvernance et pĂ©rennitĂ©.

Une partie de la rĂ©putation reste mĂ©ritĂ©e. Les chaĂźnes sont des suites d’octets, la bibliothĂšque standard garde ses noms historiques, il n’y a ni gĂ©nĂ©riques ni threads en espace utilisateur, et le runtime est synchrone par dĂ©faut. Une grande part du PHP qui tourne sur le web public est vieille, parce que l’hĂ©bergement qui la fait tourner est vieux. Chacune de ces limites se trouve dans le chapitre oĂč vous iriez la chercher, Ă  cĂŽtĂ© de la pratique qui l’entoure aujourd’hui, et LĂ  oĂč PHP est le mauvais choix rassemble les cas oĂč le conseil honnĂȘte est de choisir autre chose.

Une feuille de papier divisée en deux colonnes par un trait vertical. La colonne de gauche est coiffée d'une coche et contient quelques barres bien nettes et un petit éléphant ; la colonne de droite est coiffée d'une croix et contient elle aussi quelques barres. Une main tient un stylo au-dessus de la feuille et remplit les deux colonnes

Les questions, dans l’ordre

Chaque chapitre rĂ©pond Ă  une question que vous poseriez, dans l’ordre d’une revue de due diligence, de l’extĂ©rieur vers l’intĂ©rieur.

Empreinte demande qui tourne sur PHP et Ă  quelle Ă©chelle, et rĂ©pond par les parts de marchĂ© du web, par les plateformes bĂąties dessus et par les organisations qui dĂ©crivent leur production PHP avec leurs propres mots. Le runtime explique le modĂšle d’exĂ©cution, parce que l’essentiel de ce que PHP fait bien et de ce qu’il ne sait pas faire en dĂ©coule. DĂ©bit et latence et Concurrence donnent les chiffres de performance, avec le round du benchmark, le matĂ©riel et le test nommĂ©s, et avec, sur le mĂȘme graphique, les langages qui battent PHP sur le mĂȘme test.

Le langage en 2026 est le tour de la syntaxe le plus court possible, pour ceux qui jugent un langage en le lisant. L’écosystĂšme compte les paquets, les frameworks et les outils. Gouvernance et pĂ©rennitĂ© couvre le processus des RFC, le calendrier des versions, le processus de sĂ©curitĂ© et l’argent, et CoĂ»t de possession regarde le recrutement, l’hĂ©bergement et les mises Ă  niveau.

LĂ  oĂč PHP est le mauvais choix est le chapitre qui rend les autres crĂ©dibles. Une Ă©valuation en une semaine est un protocole, quoi installer, quoi mesurer, quoi lire, pour que la dĂ©cision que vous prendrez repose sur vos chiffres et non sur les miens.

Les rÚgles que je me suis fixées

Les comparaisons sont symĂ©triques. Quand un graphique montre PHP devant un langage sur une mesure, le texte nomme une mesure oĂč ce langage est devant, quand elle existe. Les options courantes que vous vous attendez Ă  voir, Node.js, Python, Java, C#, Go, Ruby, ne sont jamais Ă©cartĂ©es d’un graphique parce qu’elles y feraient bonne figure.

Les noms viennent avec des preuves. Une entreprise n’apparaĂźt ici que si ses propres ingĂ©nieurs, dans un billet de blog, une confĂ©rence, un dĂ©pĂŽt ou un rapport, disent qu’elle fait tourner PHP en production, et l’annexe renvoie Ă  ce document avec sa date. Les entreprises qui font tourner Hack sur HHVM, un langage issu d’un fork de PHP, ne sont pas prĂ©sentĂ©es comme des utilisatrices de PHP, si tentant que fĂ»t le logo.

Les frameworks et les outils sont listĂ©s, pas recommandĂ©s. Ils apparaissent par ordre alphabĂ©tique. La PHP Foundation, sous l’égide de laquelle ce livre paraĂźt, promeut le langage et ses standards plutĂŽt qu’un fournisseur, et je fais de mĂȘme.

Comment le vérifier

Chaque chapitre se termine par quelque chose que vous pouvez vĂ©rifier en un aprĂšs-midi : un tableau de bord public Ă  ouvrir, un benchmark Ă  relancer sur votre matĂ©riel, une commande Ă  taper. Prenez-les au sĂ©rieux. Un chiffre que j’ai mal relevĂ©, ou qui a vieilli depuis que je l’ai Ă©crit, est exactement ce que vous devriez trouver, et Sources vous donne l’URL pour le trouver.

Votre premiĂšre question est sans doute celle par laquelle j’ai commencĂ© moi aussi : qui tourne vraiment lĂ -dessus ?

Empreinte

Votre premiĂšre question est de savoir qui tourne vraiment lĂ -dessus, Ă  quelle Ă©chelle, et si la rĂ©ponse tient dans une liste de logos ou dans une liste de documents. PHP est le langage cĂŽtĂ© serveur d’environ sept sites web sur dix parmi ceux dont le langage peut ĂȘtre dĂ©tectĂ©, et cette part baisse depuis dix ans. Les deux moitiĂ©s de cette phrase comptent, et aucune ne vaut grand-chose tant que vous ne savez pas ce que l’enquĂȘte compte.

Ce que mesure la part du web

Langages cÎté serveur, part des sites web Barres horizontales : PHP 69,9 pour cent, JavaScript 7,5, Ruby 7,1, Java 5,4, Scala 5,0, ASP.NET 4,2, Python 1,1 Langages cÎté serveur, part des sites web PHP 69,9% JavaScript 7,5% Ruby 7,1% Java 5,4% Scala 5% ASP.NET 4,2% Python 1,1% W3Techs, 17 septembre 2026. Part des sites dont le langage serveur est détectable. Un site peut utiliser plusieurs langages. Plus de 20 millions de sites ; wordpress.com compte pour un seul site.

W3Techs, la sociĂ©tĂ© d’études derriĂšre ce chiffre, inspecte chaque jour un Ă©chantillon de plus de vingt millions de sites web et dĂ©tecte le langage cĂŽtĂ© serveur Ă  partir des en-tĂȘtes de rĂ©ponse, des cookies, des extensions de fichiers et d’autres traces du mĂȘme genre. Le pourcentage est calculĂ© sur les sites dont le langage a pu ĂȘtre dĂ©tectĂ©, si bien qu’un site derriĂšre un framework qui ne laisse aucune trace n’est pas comptĂ©. Chaque site compte pour un, et l’ensemble de wordpress.com ou de wix.com pĂšse autant qu’un blog personnel. Un site peut aussi utiliser plusieurs langages, ce qui explique que les colonnes ne totalisent pas cent.

À la mĂȘme date, JavaScript cĂŽtĂ© serveur est Ă  7,5 %, Ruby Ă  7,1, Java Ă  5,4, Scala Ă  5,0, ASP.NET Ă  4,2 et Python Ă  1,1. Dans ses limites, l’enquĂȘte est stable dans ce qu’elle dit : le gros du web adressable tourne sur PHP, surtout Ă  travers WordPress, et les langages dont on parle davantage sont petits sur cette mesure. Scala devant ASP.NET rappelle que l’enquĂȘte compte ce que sa dĂ©tection voit, et que quelques plateformes laissent une signature sans rapport avec leur usage.

Langages cÎté serveur, 2015 à 2026 Courbes : PHP passe de 80,6 pour cent en 2015 à 72,4 en janvier 2026 ; JavaScript monte de 0,1 à 5,4 ; Ruby de 0,9 à 6,5 ; ASP.NET descend de 16,7 à 4,6 ; Java monte de 2,8 à 5,4 Langages cÎté serveur, 2015 à 2026 0% 20% 40% 60% 80% 100% 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 PHP (72,4%) Ruby (6,5%) JavaScript (5,4%) Java (5,4%) ASP.NET (4,6%) W3Techs, tendances annuelles, valeurs au 1er janvier de chaque année. Relevé le 17 septembre 2026. Part des sites dont le langage serveur est détectable. Au 17 septembre 2026 : PHP 69,9, JavaScript 7,5, Ruby 7,1.

La part de PHP sur cette mesure Ă©tait de 80,6 % au 1er janvier 2015, de 75,2 au 1er janvier 2025 et de 72,4 au 1er janvier 2026, puis de 69,9 en septembre 2026. La tendance est Ă  la baisse, et c’est la premiĂšre chose Ă  regarder. Le dĂ©clin s’est accĂ©lĂ©rĂ© en 2025 et 2026, et la part qui a quittĂ© PHP est allĂ©e pour l’essentiel vers JavaScript cĂŽtĂ© serveur, dont W3Techs a notĂ© en juillet 2026 qu’il avait dĂ©passĂ© Ruby Ă  la deuxiĂšme place. Deux faits se tiennent cĂŽte Ă  cĂŽte : une base installĂ©e sur le web public que rien d’autre n’égale, et une courbe qui ne va pas dans le sens de PHP.

Les plateformes

L’essentiel de cette base installĂ©e, ce sont des produits, pas du code sur mesure. WordPress Ă  lui seul fait tourner 40,2 % de tous les sites web, soit 58,8 % des sites qui utilisent un systĂšme de gestion de contenu dĂ©tectable, et les systĂšmes PHP suivants, Joomla, Drupal, PrestaShop et TYPO3, sont chacun sous les deux pour cent. WooCommerce, l’extension de commerce de WordPress, Ă©quipe 8,0 % de tous les sites web et reprĂ©sente 47,7 % des systĂšmes de commerce en ligne dĂ©tectĂ©s.

SystÚmes de gestion de contenu, part de tous les sites web Barres horizontales : WordPress 40,2 pour cent de tous les sites, Shopify 5,4, Wix 4,2, Squarespace 2,4, Joomla 1,1, Drupal 0,6, PrestaShop 0,5, TYPO3 0,3. Les barres bleues sont écrites en PHP. SystÚmes de gestion de contenu, part de tous les sites web WordPress 40,2% Shopify 5,4% Wix 4,2% Squarespace 2,4% Joomla 1,1% Drupal 0,6% PrestaShop 0,5% TYPO3 0,3% W3Techs, 17 septembre 2026. En bleu : écrit en PHP. 31,5 % des sites n'utilisent aucun CMS détecté. Shopify, Wix et Squarespace sont des plateformes hébergées, pas des logiciels installables.

Les plateformes publient aussi leurs propres dĂ©comptes, chacun avec son biais. Moodle, la plateforme d’apprentissage, dĂ©clare 146 634 sites enregistrĂ©s et 531 millions d’utilisateurs, en ne comptant que les sites qui ont choisi de s’enregistrer. Nextcloud annonce plus de 500 000 serveurs. Drupal compte 470 795 sites qui remontent leur version par son module de mise Ă  jour, ce qui oublie ceux qui l’ont dĂ©sactivĂ©. PrestaShop revendique prĂšs de 250 000 sites et plus de 22 milliards d’euros de ventes passĂ©es par eux en 2024, un chiffre auto-dĂ©clarĂ©. Shopware cite une Ă©tude EHI qui le place sur 115 des 1 000 plus grandes boutiques B2C allemandes en 2025, et Matomo, la plateforme d’analyse d’audience, annonce plus de 1,4 million de sites web. Adobe ne publie aucun dĂ©compte de marchands pour Adobe Commerce, donc je n’en donne aucun.

Aucun chiffre de cette liste ne compte autant que sa forme. La gestion de contenu, le commerce, l’apprentissage, le partage de fichiers et l’analyse d’audience sont les catĂ©gories oĂč l’on installe un produit sur un serveur et oĂč on le laisse tourner des annĂ©es, et ce sont celles que les logiciels PHP dominent. C’est de lĂ  que vient la part de la section prĂ©cĂ©dente.

Un théùtre vu depuis les coulisses. Sur la scĂšne, sous un projecteur, quelques petits animaux de formes diffĂ©rentes saluent. En coulisses, dans la pĂ©nombre, une rangĂ©e d'Ă©lĂ©phants calmes manƓuvrent les cordes, les contrepoids et le pupitre d'Ă©clairage qui font tourner le spectacle

Les organisations qui le disent elles-mĂȘmes

Une entreprise n’apparaĂźt ici que si ses propres ingĂ©nieurs ou ses propres documents disent qu’elle fait tourner PHP, et la date de ce document fait partie de la preuve.

Wikimedia Foundation. WikipĂ©dia et ses projets frĂšres tournent sur MediaWiki, une application PHP servie par PHP-FPM. Les Ă©tats financiers auditĂ©s de la fondation font Ă©tat de plus de 19,4 milliards de pages vues par mois sur l’ensemble de ses projets. Sa production est passĂ©e de PHP 8.1 Ă  PHP 8.3 le 25 novembre 2025, et au moment oĂč j’écris, la migration vers PHP 8.5 est prĂ©vue pour la fin 2026. La mĂȘme infrastructure a tournĂ© sur HHVM jusqu’en 2019, annĂ©e oĂč la fondation a achevĂ© son retour Ă  l’interprĂ©teur PHP. La fondation rapporte aussi des pics de 800 000 requĂȘtes par seconde sur ses sept centres de donnĂ©es, un chiffre comptĂ© en bordure, oĂč la couche de cache sert la plupart des requĂȘtes sans qu’elles atteignent jamais PHP ; ne le lisez donc pas comme un dĂ©bit PHP.

Automattic. WordPress.com et Tumblr, selon Automattic, « tournent principalement sur PHP ». WordPress VIP, la branche d’hĂ©bergement pour grands comptes du groupe, publie 2 400 milliards de requĂȘtes servies par an et 22 milliards de requĂȘtes la nuit de l’élection amĂ©ricaine de 2024, des chiffres qui incluent son CDN.

Etsy. La page carriĂšres de l’ingĂ©nierie de la place de marchĂ© indique que ses ingĂ©nieurs « codent principalement en PHP et en JavaScript », aux cĂŽtĂ©s de Java, Go et Swift. Etsy a fait passer sa production Ă  PHP 7 en 2016 et a documentĂ© le passage Ă  l’époque, graphiques de production Ă  l’appui.

Mailchimp. Le blog dĂ©veloppeurs de l’entreprise dĂ©crit son exĂ©cuteur de tĂąches et son monolithe applicatif en PHP, et ses offres d’emploi en ingĂ©nierie de 2025 et 2026 demandent PHP aux cĂŽtĂ©s de React et de Go. Aucun chiffre d’échelle n’est publiĂ©.

Bumble (Badoo). Le blog d’ingĂ©nierie dĂ©crivait, en 2017, plus de trois millions de lignes de PHP et des centaines de serveurs applicatifs passĂ©s Ă  PHP 7, avec une Ă©conomie annoncĂ©e d’un million de dollars en matĂ©riel. Ce chiffre a neuf ans et vous devez le peser comme tel ; les offres d’emploi actuelles de l’entreprise listent toujours PHP Ă  cĂŽtĂ© de Go.

Secteur public. Les sites web de la Commission europĂ©enne tournent sur Drupal, ce que leurs pages dĂ©clarent dans leurs mĂ©tadonnĂ©es. Des agents de la Commission ont prĂ©sentĂ© la plateforme Ă  Drupal4Gov EU en janvier 2026, avec 770 sites en ligne, un chiffre rapportĂ© par des participants et que je n’ai pas pu confirmer dans une publication de la Commission. Le site de la Maison-Blanche tourne sur WordPress, hĂ©bergĂ© chez WordPress VIP sous une autorisation FedRAMP Moderate. Le Government Site Builder fĂ©dĂ©ral allemand, le CMS standard des administrations fĂ©dĂ©rales, est bĂąti sur TYPO3 et sert plus de 80 administrations et 250 sites web. La plateforme australienne GovCMS dĂ©clare plus de 370 sites gouvernementaux sur Drupal, et 77 collectivitĂ©s locales du Royaume-Uni partagent la distribution LocalGov Drupal.

Qui est parti, et qui n’y a jamais Ă©tĂ©

La liste des entreprises qui ont abandonné PHP est aussi instructive que celle qui précÚde, et elle est plus courte que la réputation ne le laisse croire.

Meta et Slack sont les deux noms qu’on cite le plus souvent pour PHP Ă  grande Ă©chelle, et ni l’un ni l’autre ne fait tourner PHP. Les deux font tourner Hack, un langage que Facebook a annoncĂ© en 2014, sur HHVM, une machine virtuelle qu’il dĂ©veloppait pour PHP depuis 2011 et qui a abandonnĂ© la compatibilitĂ© avec PHP en 2019. Slack a retirĂ© son dernier code PHP lors du passage Ă  HHVM 4 et maintient aujourd’hui environ cinq millions de lignes de Hack. Les deux entreprises montrent qu’une base de code commencĂ©e en PHP peut devenir trĂšs grande, et aucune des deux ne dit quoi que ce soit sur l’interprĂ©teur PHP, donc je ne les compte jamais.

Zalando a réécrit sa boutique Magento en Java en 2010, d’aprĂšs le tĂ©moignage d’un ancien ingĂ©nieur. Trivago a remplacĂ© une grande base de code PHP par une application TypeScript entre 2020 et 2021. Dailymotion, qui servait son site avec PHP et Symfony depuis 2005, indique dans une offre d’emploi de 2026 qu’elle « rĂ©duit progressivement PHP » et que les nouveaux dĂ©veloppements se font en Go, Java et Python. BlaBlaCar, une maison Symfony en 2015, dĂ©crit dans ses offres une migration « d’une pile PHP/Symfony vers une pile dominĂ©e par Java et JS ». VoilĂ  les cas que j’ai trouvĂ©s avec une source primaire, et ils ont un motif commun : une entreprise dont le produit avait dĂ©passĂ© le cadre d’un monolithe web a dĂ©placĂ© ses services vers un langage compilĂ© ou vers la JVM, comme le font au mĂȘme stade les entreprises qui quittent Ruby ou Python.

La population de développeurs

La part du web mesure des serveurs. Les enquĂȘtes mesurent des personnes, et elles placent PHP plus bas.

MesureOĂč se situe PHPSource et date
UtilisĂ© au cours de l’annĂ©e Ă©coulĂ©e, dĂ©veloppeurs professionnels19,1 %, 12e langageEnquĂȘte Stack Overflow, 2025
UtilisĂ© au cours de l’annĂ©e Ă©coulĂ©e, Ă©chantillon pondĂ©rĂ©17 %, 13e langageJetBrains Developer Ecosystem, 2025
Langage principal9 %, 9eJetBrains Developer Ecosystem, 2025
Contributeurs mensuels sur GitHub6e langage, inchangé depuis 2023GitHub Octoverse, octobre 2025
Pull requests et tags Stack Overflow4e, à égalité avec C#RedMonk, janvier 2026
Mentions dans les moteurs de recherche14e, 1,04 %TIOBE, septembre 2026

Chacune de ces mesures porte sur autre chose, et chacune a un biais connu : l’échantillon de Stack Overflow est auto-sĂ©lectionnĂ© parmi ses utilisateurs, celui de JetBrains est pondĂ©rĂ© vers ses clients, GitHub compte l’activitĂ© open source et TIOBE compte des rĂ©sultats de recherche. Lues ensemble, elles disent qu’entre un dĂ©veloppeur sur six et un sur cinq a Ă©crit du PHP dans l’annĂ©e, que PHP est un premier langage pour moins de gens qu’il n’est un second, et que son activitĂ© sur les dĂ©pĂŽts publics ne bouge pas. JetBrains dĂ©crit PHP comme en « dĂ©clin de long terme » aux cĂŽtĂ©s de Ruby et d’Objective-C, tandis que l’enquĂȘte consacrĂ©e Ă  PHP du mĂȘme rapport a trouvĂ© que 58 % des dĂ©veloppeurs PHP ne prĂ©voient pas de migrer vers un autre langage. Ce que cela veut dire pour le recrutement est une question pour CoĂ»t de possession.

La limite : l’empreinte est large et vieille. Sa largeur vient des produits plus que des applications sur mesure, son Ăąge se lit dans la part de la base installĂ©e encore sur des versions non maintenues, et la part du langage parmi les dĂ©veloppeurs est plus petite que sa part des serveurs en service. Si vous choisissez un langage pour un nouveau service, donnez au second fait plus de poids qu’au premier.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Ouvrez les pages W3Techs des langages cĂŽtĂ© serveur et des systĂšmes de gestion de contenu ; elles sont mises Ă  jour chaque jour et la vue historique est publique. Pour Wikimedia, les tĂąches Phabricator que je cite se lisent sans compte et montrent le travail de migration tel qu’il s’est dĂ©roulĂ©, dates comprises. Pour toute entreprise nommĂ©e ici, allez fouiller vous-mĂȘme son blog d’ingĂ©nierie et ses offres d’emploi, et traitez l’absence de PHP dans les offres rĂ©centes comme le signal qu’elle est.

L’échelle du dĂ©ploiement ne dit rien de la façon dont une requĂȘte est servie. C’est lĂ  que le runtime entre en scĂšne.

Le runtime

L’essentiel de ce que PHP fait bien, et l’essentiel de ce qu’il ne sait pas faire, dĂ©coule de la façon dont il sert une requĂȘte. Une requĂȘte PHP dĂ©marre sans rien, exĂ©cute votre code de haut en bas, envoie sa rĂ©ponse et est jetĂ©e ; la concurrence vient d’un pool de processus, chacun traitant une requĂȘte Ă  la fois. Rien ne survit d’une requĂȘte Ă  la suivante Ă  l’intĂ©rieur du processus, et c’est pour cela qu’on appelle ce modĂšle shared-nothing : aucun objet application ne reste en vie, pas de boucle d’évĂ©nements, pas de thread.

Une requĂȘte, un processus

Le dĂ©ploiement standard, c’est PHP-FPM, le gestionnaire de processus FastCGI, derriĂšre un serveur web comme nginx, Apache ou Caddy. Le gestionnaire entretient un pool de processus worker, confie chaque requĂȘte entrante Ă  un worker libre, et le worker exĂ©cute le script, Ă©crit la rĂ©ponse et revient dans le pool la mĂ©moire vidĂ©e. La taille du pool tient en une ligne de configuration. Une machine avec plus de cƓurs fait tourner plus de workers, et plus de machines derriĂšre un rĂ©partiteur de charge font tourner plus de pools, sans la moindre coordination entre eux.

Une rangĂ©e de six petites piĂšces identiques dessinĂ©es cĂŽte Ă  cĂŽte. Dans chacune, un Ă©lĂ©phant reçoit une enveloppe par une fente, travaille Ă  un bureau, tend une feuille par une autre fente, et la piĂšce est balayĂ©e derriĂšre lui. Une septiĂšme piĂšce, au bout, est vide et en train d'ĂȘtre balayĂ©e. Rien ne passe d'une piĂšce Ă  l'autre

Une Ă©quipe plateforme remarque d’abord le bon cĂŽtĂ© de ce modĂšle. Une requĂȘte qui plante, qui fuit ou qui dĂ©passe son temps emporte un worker avec elle et rien d’autre ; le gestionnaire remplace le worker et les autres requĂȘtes n’en voient rien. Une fuite mĂ©moire ne peut pas s’accumuler au-delĂ  d’une requĂȘte, si bien qu’une application PHP qui tourne longtemps ne se dĂ©grade pas au fil des jours comme peut le faire un processus qui vit longtemps. DĂ©ployer, c’est copier des fichiers puis vider un cache, parce qu’il n’y a aucun processus Ă  redĂ©marrer proprement et aucun Ă©tat en mĂ©moire Ă  drainer.

Le mĂȘme modĂšle a ses coĂ»ts, et c’est un ingĂ©nieur performance qui les voit en premier. Chaque requĂȘte paie l’amorçage de l’application : lire la configuration, cĂąbler les dĂ©pendances, enregistrer les routes. Il n’y a pas de cache en processus d’une requĂȘte Ă  l’autre, si bien qu’une table calculĂ©e une fois par processus dans un autre langage l’est ici une fois par requĂȘte, Ă  moins de la ranger en mĂ©moire partagĂ©e via l’extension APCu ou dans un cache externe. Les connexions Ă  la base de donnĂ©es s’ouvrent et se ferment Ă  chaque requĂȘte, sauf Ă  les configurer comme persistantes, si bien qu’un pool de connexions, quand il en faut un, vit hors de PHP. Une charge qui doit garder un Ă©tat entre les requĂȘtes, un serveur WebSocket ou un salon de jeu, n’entre pas du tout dans ce modĂšle, et Concurrence explique ce qui y entre Ă  la place.

OPcache, le préchargement et le JIT

L’objection Ă©vidente Ă  un amorçage Ă  chaque requĂȘte, c’est le coĂ»t d’analyser et de compiler le source Ă  chaque fois, et PHP l’a levĂ©e en 2013. OPcache garde la forme compilĂ©e de chaque fichier en mĂ©moire partagĂ©e, si bien qu’un fichier est compilĂ© une fois par dĂ©ploiement et non une fois par requĂȘte. Il fait partie de la distribution standard depuis PHP 5.5 et il est activĂ© dans le modĂšle php.ini-production livrĂ© avec elle ; un benchmark lancĂ© sans lui ne mesure rien de PHP.

Le prĂ©chargement, arrivĂ© avec PHP 7.4, va un cran plus loin. Une liste de fichiers est compilĂ©e et liĂ©e au dĂ©marrage du gestionnaire puis gardĂ©e en mĂ©moire, si bien que les classes existent avant la premiĂšre requĂȘte et qu’aucun autoloading n’a lieu. La RFC qui l’a introduit a mesurĂ© un gain de 30 % sur la page hello-world d’un framework et de 50 % sur celle d’un autre, et prĂ©cise dans le mĂȘme paragraphe que les gains en conditions rĂ©elles « seront probablement plus faibles » et dĂ©pendent du rapport entre l’amorçage et le travail effectif.

Le compilateur JIT, ajoutĂ© dans PHP 8.0 Ă  l’intĂ©rieur d’OPcache, compile les chemins de code chauds en code machine, et ses propres notes de version sont plus sobres que les gros titres. php.net indique que le JIT traçant « montre des performances environ 3 fois meilleures sur des benchmarks synthĂ©tiques et une amĂ©lioration de 1,5 Ă  2 fois sur certaines applications spĂ©cifiques de longue durĂ©e », et que « les performances d’une application typique sont au niveau de PHP 7.4 ». La mesure de la RFC elle-mĂȘme sur WordPress donnait 326 requĂȘtes par seconde avec le JIT contre 315 sans. Le JIT n’a jamais Ă©tĂ© activĂ© par dĂ©faut : avant PHP 8.4, la taille de son tampon Ă©tait zĂ©ro, et depuis 8.4 un tampon de 64 mĂ©gaoctets est rĂ©servĂ© mais opcache.jit vaut disable, si bien qu’il faut l’activer explicitement. Une application web en tire peu, un script limitĂ© par le CPU peut en tirer beaucoup.

Les runtimes worker

Le seul coĂ»t qu’OPcache ne supprime pas est l’amorçage de l’application, et une seconde famille de runtimes le supprime en gardant l’application en mĂ©moire. En mode worker, un processus amorce l’application une fois, puis traite les requĂȘtes en boucle, une Ă  la fois, pendant des milliers de requĂȘtes avant d’ĂȘtre recyclĂ©. Par ordre alphabĂ©tique : FrankenPHP, un serveur d’application Ă©crit en Go au-dessus du serveur web Caddy, qui propose aussi bien le mode classique d’une requĂȘte par processus qu’un mode worker ; RoadRunner, un serveur d’application lui aussi Ă©crit en Go, qui garde en vie un pool de workers PHP et leur transmet les requĂȘtes par un protocole ; et Swoole, ou son fork OpenSwoole, une extension en C qui donne Ă  PHP sa propre boucle d’évĂ©nements et son propre serveur HTTP. FrankenPHP est hĂ©bergĂ© sous l’organisation php sur GitHub depuis le 8 juin 2025, avec une gouvernance inchangĂ©e.

Ce que le changement rapporte dĂ©pend entiĂšrement du prix de l’amorçage, et la façon honnĂȘte de le montrer est de prendre le mĂȘme code avec le runtime pour seule variable. Sur un script hello-world nu, oĂč il n’y a aucun amorçage Ă  Ă©viter, Tideways, un Ă©diteur de profileur PHP et membre fondateur de la PHP Foundation sans intĂ©rĂȘt dans l’un ou l’autre runtime, a trouvĂ© FrankenPHP en mode classique et PHP-FPM Ă  moins d’un demi pour cent l’un de l’autre, autour de 18 400 requĂȘtes par seconde sur une machine virtuelle Ă  huit cƓurs. Sur un framework complet, la suite de benchmarks que DĂ©bit et latence lit en dĂ©tail montre l’entrĂ©e Symfony passer de 26 000 requĂȘtes par seconde sous PHP-FPM Ă  74 000 sous FrankenPHP et 111 000 sous Swoole sur son test Fortunes, sans une ligne changĂ©e dans le framework. Les Ă©diteurs et les auteurs de frameworks publient des rapports plus Ă©levĂ©s sur leurs propres pages. Je m’en tiens Ă  ces deux chiffres parce que vous pouvez reproduire l’un et l’autre Ă  partir de documents publiĂ©s.

Le prix, c’est la perte de la garantie shared-nothing. Un worker qui garde l’application amorcĂ©e garde aussi tout ce qu’elle a laissĂ© fuir, si bien que propriĂ©tĂ©s statiques, caches et ressources ouvertes persistent dĂ©sormais d’une requĂȘte Ă  l’autre, et qu’une classe de bugs que PHP-FPM rendait impossible redevient possible. La documentation de FrankenPHP le dit sans dĂ©tour : PHP « n’a pas Ă©tĂ© conçu Ă  l’origine pour des processus de longue durĂ©e », et le mode worker est livrĂ© avec un compteur de requĂȘtes maximum qui recycle les processus par prĂ©caution. Une Ă©quipe qui choisit le mode worker endosse la discipline que les Ă©quipes Node.js ou Java ont dĂ©jĂ .

Ce que coûte un processus

Vous voudrez un point de rĂ©fĂ©rence avant d’ajouter le moindre framework. Sur la machine oĂč j’ai Ă©crit ce livre, un processus PHP 8.3 en ligne de commande, sans script, alloue 2 mĂ©gaoctets pour son propre tas, atteint 33 mĂ©gaoctets de mĂ©moire rĂ©sidente en comptant l’interprĂ©teur et ses extensions chargĂ©es, et dĂ©marre puis se termine en 20 millisecondes, mesurĂ© avec memory_get_usage(true) et /usr/bin/time. Reproduisez ces mesures sur votre matĂ©riel, et souvenez-vous qu’un worker PHP-FPM partage avec ses frĂšres les pages en lecture seule de l’interprĂ©teur, si bien qu’un worker de plus coĂ»te moins que le chiffre ne le suggĂšre. La configuration de production de Wikimedia, publiĂ©e dans son gestionnaire de tĂąches, fait tourner huit workers PHP-FPM par conteneur MediaWiki, avec un OPcache de 500 mĂ©gaoctets et un cache APCu de 768 mĂ©gaoctets, dans un Ă  deux gigaoctets de mĂ©moire par conteneur.

La limite : le modĂšle shared-nothing n’a ni threads, ni Ă©tat partagĂ© en processus, ni travail en arriĂšre-plan Ă  l’intĂ©rieur d’une requĂȘte. Tout ce qui doit survivre Ă  une requĂȘte, un pool de connexions, un cache chaud, une tĂąche planifiĂ©e, vit dans un autre processus ou un autre systĂšme, et l’architecture autour d’une application PHP en porte la marque. C’est une vraie contrainte, et c’est aussi ce qui rend l’exploitation simple.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Installez PHP-FPM et un serveur web sur une petite machine virtuelle, activez la page de statut de FPM, et regardez le pool sous un gĂ©nĂ©rateur de charge comme wrk ou ab : le nombre de processus, la mĂ©moire par worker et le temps de requĂȘte sont lĂ , sous vos yeux. Lancez ensuite le mĂȘme hello-world sous FrankenPHP en mode worker et comparez. Un aprĂšs-midi de ce rĂ©gime vous apprend plus sur le runtime que je ne viens de le faire, et les chiffres seront les vĂŽtres.

Un chiffre de dĂ©bit ne veut dire quelque chose qu’une fois que vous savez lequel de ces runtimes l’a produit.

Débit et latence

À quelle vitesse va-t-il, sur quelle mesure, et face Ă  qui ? C’est votre deuxiĂšme question, et c’est celle oĂč la hype fait le plus de dĂ©gĂąts. Sur le plus grand benchmark public qui compare des frameworks web de tous langages, les entrĂ©es PHP s’étalent sur deux ordres de grandeur selon le runtime qui les fait tourner, des quarante premiĂšres places au dernier dixiĂšme. Le langage seul ne prĂ©dit rien ; le dĂ©ploiement prĂ©dit presque tout. Un Ă©cart pareil ne vous sert que si chaque chiffre vient avec son round, son matĂ©riel et son test, et ceux de ce chapitre les ont tous les trois.

L’histoire du moteur

Sur du code qui occupe le processeur, l’interprĂ©teur a fait un grand pas une fois, puis des petits pas depuis. Le grand pas, c’est PHP 7.0, en dĂ©cembre 2015, qui a remplacĂ© les structures de donnĂ©es internes du moteur. Son Ă©diteur affirmait alors que le temps d’exĂ©cution Ă©tait « souvent divisĂ© par deux » par rapport Ă  PHP 5.6, dans un livre blanc sans mĂ©thodologie publiĂ©e. Une mesure indĂ©pendante, faite sur une seule machine avec toutes les versions de l’interprĂ©teur de 5.6 Ă  une build de dĂ©veloppement de PHP 8.0, retrouve la mĂȘme forme. Le score PHPBench, une suite synthĂ©tique de micro-benchmarks de l’interprĂ©teur, passe de 288 000 sur PHP 5.6 Ă  620 000 sur PHP 7.0, puis monte par petites marches, entre rien et treize pour cent par version, jusqu’à 876 000 sur la build 8.0.

Score PHPBench par version de PHP, mĂȘme machine (plus haut est mieux) Barres horizontales, milliers de points : PHP 5.6.40 288, 7.0.33 620, 7.1.33 700, 7.2.28 772, 7.3.15 816, 7.4.3 814, 8.0-dev 876, 8.0-dev avec JIT 875 Score PHPBench par version de PHP, mĂȘme machine (plus haut est mieux) PHP 5.6.40 288 PHP 7.0.33 620 PHP 7.1.33 700 PHP 7.2.28 772 PHP 7.3.15 816 PHP 7.4.3 814 PHP 8.0-dev (fĂ©v. 2020) 876 OpenBenchmarking.org, rĂ©sultat 2002269-VE-PHPBENCHM24 par Michael Larabel, fĂ©vrier 2020, Core i9-9900KS, Ubuntu 20.04, PHPBench 0.8.1, moyenne de trois exĂ©cutions. PHPBench est un micro-benchmark CPU synthĂ©tique de l'interprĂ©teur, pas une application web. PHP 8.0 est un instantanĂ© de dĂ©veloppement de fĂ©vrier 2020, avant l'arrivĂ©e du JIT traçant.

Depuis PHP 8.0, la vitesse de l’interprĂ©teur sur une application web ne bouge plus, et ceux qui la mesurent le disent eux-mĂȘmes. Un hĂ©bergeur qui publie des benchmarks chaque annĂ©e a mesurĂ© WordPress Ă  146 requĂȘtes par seconde sur PHP 8.2 et Ă  148 sur PHP 8.5, sur la mĂȘme machine, et il Ă©crit que « les versions incrĂ©mentales produisent rarement de grands sauts de vitesse Ă  elles seules ». C’est sa propre mesure, lancĂ©e Ă  quinze requĂȘtes simultanĂ©es sur une machine de trente cƓurs ; elle dit donc le temps de rĂ©ponse, pas la capacitĂ©. Retenez ceci : une version actuelle de PHP est Ă  peu prĂšs deux fois plus rapide que PHP 5 sur le travail propre de l’interprĂ©teur, et une montĂ©e de version mineure ne vous apportera rien d’autre que des corrections et des fonctionnalitĂ©s.

Le benchmark multi-langages

Le Framework Benchmarks de TechEmpower est une suite publique qui a fait passer des centaines de frameworks web, dans des dizaines de langages, par les six mĂȘmes tests sur le mĂȘme matĂ©riel, chaque implĂ©mentation Ă©tant contribuĂ©e et entretenue par des volontaires dans un dĂ©pĂŽt public. Son dernier round achevĂ© est le Round 23, datĂ© du 24 fĂ©vrier 2025, exĂ©cutĂ© sur un serveur Ă  processeur Xeon Gold 6330, 28 cƓurs et 56 threads, avec un rĂ©seau Ă  40 gigabits. Le dĂ©pĂŽt du projet a Ă©tĂ© archivĂ© le 24 mars 2026 : le Round 23 est donc le dernier, et ses chiffres sont les derniers de leur espĂšce. Rien d’autre ne compare autant de frameworks sous un mĂȘme protocole, c’est pourquoi je les garde. Et comme les tests ne mesurent pas la mĂȘme chose, chaque chiffre nomme le sien.

Le test Fortunes est celui qui ressemble le plus Ă  une page web : une requĂȘte en base qui renvoie une douzaine de lignes, un gabarit HTML rendu avec Ă©chappement. Sur ce test, 510 entrĂ©es ont terminĂ© le Round 23. Le graphique en retient seize, les leaders toutes catĂ©gories, le framework grand public de chaque langage majeur et les entrĂ©es PHP de chaque type de runtime. Le tableau brut avec toutes les entrĂ©es est rangĂ© Ă  cĂŽtĂ© des donnĂ©es de graphiques du livre, pour que vous puissiez faire votre propre sĂ©lection.

TechEmpower Round 23, test Fortunes, milliers de requĂȘtes par seconde Barres horizontales, sĂ©lection d'entrĂ©es : may-minihttp (Rust) 1327, vertx-postgres (Java) 1041, workerman (PHP, Postgres) 743, asp.net core (C#) 446, ubiquity sur workerman (PHP, ORM complet) 428, fiber (Go) 411, spring (Java) 244, php sur PHP-FPM et nginx 146, php sur FrankenPHP 129, gin (Go) 111, fastapi (Python) 109, express (Node.js) 78, rails (Ruby) 43, django (Python) 32, symfony sur PHP-FPM 26, laravel sur PHP-FPM 16 TechEmpower Round 23, test Fortunes, milliers de requĂȘtes par seconde may-minihttp (Rust) 1 327 vertx-postgres (Java) 1 041 workerman (PHP) 743 asp.net core (C#) 446 ubiquity, workerman (PHP) 428 fiber (Go) 411 spring (Java) 244 php, PHP-FPM + nginx 146 php, FrankenPHP 129 gin (Go) 111 fastapi (Python) 109 express (Node.js) 78 rails (Ruby) 43 django (Python) 32 symfony, PHP-FPM 26 laravel, PHP-FPM 16 TechEmpower Framework Benchmarks, Round 23 (24 fĂ©vrier 2025), test Fortunes, environnement Citrine : Xeon Gold 6330 (28 cƓurs, 56 threads), 40 GbE. SĂ©lection de 16 entrĂ©es sur 510. Fortunes : une requĂȘte en base, rendu HTML avec Ă©chappement. En bleu : entrĂ©es PHP. Chaque barre nomme le framework et son runtime ; le langage seul ne dĂ©cide rien ici.

Lisez les barres PHP de haut en bas. Les entrĂ©es PHP les plus rapides, sur les runtimes workerman et Swoole, en SQL brut et sans framework, occupent les rangs 31 Ă  38 sur 510, au-dessus de 730 000 requĂȘtes par seconde, devant l’entrĂ©e ASP.NET Core de base, les entrĂ©es Go et Spring. Un framework PHP complet avec un ORM complet sur un runtime worker, l’entrĂ©e Ubiquity, atteint 428 000 au rang 92. PHP nu sous PHP-FPM et nginx, le dĂ©ploiement standard, atteint 146 000 au rang 248, environ un tiers devant Gin et FastAPI. Les deux frameworks PHP les plus utilisĂ©s, sous PHP-FPM, sont prĂšs du bas : Symfony Ă  26 000 et Laravel Ă  16 000, derriĂšre Rails Ă  43 000 et Django Ă  32 000. Un mĂȘme benchmark soutient donc Ă  la fois que PHP peut compter parmi les runtimes web les plus rapides et qu’une application PHP typique compte parmi les plus lentes. Quand on ne vous dit que l’un des deux, on vous vend quelque chose.

Une partie de l’écart tient au runtime. Une entrĂ©e qui garde l’application chargĂ©e entre deux requĂȘtes supprime le coĂ»t de dĂ©marrage, et c’est lui qui domine le temps de requĂȘte d’un framework.

MĂȘme framework, runtime diffĂ©rent (Fortunes, milliers de requĂȘtes par seconde) Barres horizontales. Symfony : PHP-FPM 26, RoadRunner 36, FrankenPHP 74, workerman 108, Swoole 111. Laravel : RoadRunner 8, PHP-FPM 16, Octane sur FrankenPHP 34, Swoole 34, workerman 50. MĂȘme framework, runtime diffĂ©rent (Fortunes, milliers de requĂȘtes par seconde) Symfony, Swoole 111 Symfony, workerman 108 Symfony, FrankenPHP 74 Symfony, RoadRunner 36 Symfony, PHP-FPM 26 Laravel, workerman 50 Laravel, Swoole 34 Laravel Octane, FrankenPHP 34 Laravel, PHP-FPM 16 Laravel, RoadRunner 8 TechEmpower Framework Benchmarks, Round 23 (24 fĂ©vrier 2025), test Fortunes. En bleu : la rĂ©fĂ©rence PHP-FPM. Les entrĂ©es sont maintenues par des volontaires ; une entrĂ©e lente peut reflĂ©ter sa configuration plutĂŽt que le runtime.

Le mĂȘme code Symfony passe de 26 000 requĂȘtes par seconde sous PHP-FPM Ă  74 000 sous FrankenPHP et 111 000 sous Swoole, et le mĂȘme code Laravel de 16 000 Ă  50 000 sous workerman. Le reste de l’écart tient Ă  l’entrĂ©e elle-mĂȘme. Chez TechEmpower, une entrĂ©e est entretenue par qui veut bien s’en occuper, et une entrĂ©e lente peut reflĂ©ter une configuration datĂ©e autant que le framework. L’entrĂ©e Laravel sous RoadRunner, Ă  8 000, est plus lente que sous PHP-FPM ; je n’ai pas d’explication et je la rapporte telle qu’elle a Ă©tĂ© mesurĂ©e.

Les autres tests dĂ©placent les rangs, pas l’histoire. Sur le test de sĂ©rialisation JSON, qui n’a pas de base de donnĂ©es, l’entrĂ©e Swoole atteint 2,5 millions de requĂȘtes par seconde au rang 73, PHP-FPM nu 428 000 et Laravel sous PHP-FPM 27 000, tandis qu’ASP.NET Core est Ă  1,4 million, Node.js Ă  1,1 million, Spring Ă  328 000 et Django Ă  167 000. Sur le test Ă  vingt requĂȘtes SQL, que le pilote de base de donnĂ©es bride, les leaders de tous les langages se rejoignent sous 90 000, et les entrĂ©es PHP les plus rapides sont Ă  56 000, devant FastAPI Ă  37 000 et Spring Ă  32 000.

La latence

Le dĂ©bit dit combien de requĂȘtes une machine peut absorber. La latence dit combien de temps un utilisateur attend, et ce qui la domine, c’est ce que la requĂȘte attend, pas l’interprĂ©teur. Tideways, un Ă©diteur de profileur et membre fondateur de la PHP Foundation, a mesurĂ© un hello-world PHP-FPM derriĂšre nginx sur une machine virtuelle Ă  huit cƓurs, et relevĂ© un 99e centile de 0,9 milliseconde Ă  18 000 requĂȘtes par seconde. C’est le plancher : l’interprĂ©teur et le gestionnaire de processus coĂ»tent ensemble moins d’une milliseconde quand il n’y a rien d’autre Ă  faire, et tout ce qui vient au-dessus, c’est l’application et ses dĂ©pendances.

Les chiffres de latence publics les plus utiles viennent d’une organisation qui publie ses propres objectifs et ses propres tableaux de bord. Les rĂšgles d’ingĂ©nierie de Wikimedia exigent qu’une requĂȘte GET s’achĂšve en 50 millisecondes Ă  la mĂ©diane et en 200 millisecondes au 99e centile du temps passĂ© dans PHP, et en 500 millisecondes au 99e centile pour un POST. Son instance Grafana est publique et montre la distribution mesurĂ©e pour les requĂȘtes qui atteignent les serveurs applicatifs, c’est-Ă -dire les dĂ©fauts de cache et les utilisateurs connectĂ©s, autrement dit les requĂȘtes chĂšres. Le jour oĂč j’ai vĂ©rifiĂ©, la mĂ©diane Ă©tait d’environ 170 millisecondes et la queue de distribution bien au-dessus de l’objectif, pour des pages qui incluent le rendu du wikitexte depuis un cache d’analyse froid. Je vous donne le tableau de bord plutĂŽt que l’instantanĂ©, parce qu’une semaine vous en dira plus qu’une heure.

LĂ  oĂč PHP perd

Sur du calcul pur, sans entrĂ©es-sorties, PHP est un interprĂ©teur avec un JIT en option, et il est un ordre de grandeur plus lent qu’un runtime compilĂ© Ă  la volĂ©e comme V8. Le Computer Language Benchmarks Game, qui compare des programmes contribuĂ©s sur les mĂȘmes petites tĂąches, place le programme n-body mono-thread le plus rapide Ă  2,2 secondes en Rust, 3,1 en C#, 6,0 en Java, 6,4 en Go, 8,6 en Node.js, 167 en Ruby avec YJIT, 204 en PHP 8.4 et 360 en Python 3.13.

Calcul pur : n-body, secondes Ă©coulĂ©es (plus bas est mieux) Barres horizontales, programme mono-thread le plus rapide par langage : Rust 2,2 secondes, C# 3,1, Java 6,0, Go 6,4, Node.js 8,6, Ruby 166,7, PHP 204,1, Python 360,0 Calcul pur : n-body, secondes Ă©coulĂ©es (plus bas est mieux) Rust 2,2 s C# 3,1 s Java 6 s Go 6,4 s Node.js 8,6 s Ruby 166,7 s PHP 204,1 s Python 360 s The Computer Language Benchmarks Game, n-body, entrĂ©e la plus rapide par langage, mesurĂ©e sur un Intel i5-3330 ; PHP 8.4.1, Python 3.13, Ruby 3.4 avec YJIT, Node.js 23.8. RelevĂ© le 17 septembre 2026. Programmes contribuĂ©s, un cƓur chacun ; les entrĂ©es C# et Java sont compilĂ©es Ă  l'avance. La ligne de commande PHP fixe un tampon JIT mais pas opcache.jit, que PHP 8.4 dĂ©sactive par dĂ©faut.

Le graphique a ses rĂ©serves. Les programmes PHP tournent avec un tampon JIT configurĂ© mais opcache.jit laissĂ© Ă  sa valeur par dĂ©faut de PHP 8.4, c’est-Ă -dire dĂ©sactivé : ils mesurent donc l’interprĂ©teur seul. La RFC du JIT rapporte un gain de quatre fois sur Mandelbrot une fois le JIT activĂ©, ce qui resserrerait l’écart sans le combler. Les programmes sont aussi contribuĂ©s, donc ils mesurent le meilleur programme que quelqu’un a pris la peine d’écrire. Avec ces deux rĂ©serves, l’ordre tient. Pour du calcul numĂ©rique, de la simulation, l’analyse de gros fichiers en boucle ou tout ce qui occupe un cƓur, PHP est dans la classe de Python et de Ruby, pas dans celle de Node.js, et trente Ă  cent fois derriĂšre Go, Java, C# et Rust sur ce programme. LĂ  oĂč PHP est le mauvais choix en tire la consĂ©quence.

La limite : les bons chiffres de dĂ©bit de PHP viennent des runtimes worker et de l’accĂšs brut Ă  la base, ce qu’une Ă©quipe ordinaire ne fait pas tourner dĂšs le premier jour. Ses chiffres typiques, un framework complet sous PHP-FPM, sont ceux de Rails et de Django, quelques dizaines de milliers de requĂȘtes par seconde sur une grosse machine, ce qui reste plus que ce que la plupart des applications recevront jamais. Et sur du calcul pur, l’interprĂ©teur est un ordre de grandeur derriĂšre V8.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

L’outillage TechEmpower tourne encore depuis son dĂ©pĂŽt archivĂ©, avec Docker, et les tableaux bruts du Round 23 pour six tests sont rangĂ©s en CSV dans le dossier charts/raw/ du livre : vous pouvez vĂ©rifier ma sĂ©lection et en faire une autre. Plus prĂšs de chez vous, prenez l’application que vous construiriez, ou un Ă©quivalent open source, faites-la tourner sous PHP-FPM puis sous un runtime worker sur la mĂȘme machine, et mesurez avec wrk Ă  la concurrence que vous attendez en production. Le rapport que vous obtiendrez est le seul qui compte. Pour la latence, ouvrez le tableau de bord public « Backend Pageview Timing » de Wikimedia et lisez-en une semaine.

Le dĂ©bit suppose des requĂȘtes indĂ©pendantes. Que se passe-t-il quand elles ne le sont pas ? C’est la question suivante.

Concurrence

Dix mille connexions qui dorment, cent appels sortants Ă  lancer d’un coup, un calcul qui devrait occuper tous les cƓurs : un jour ou l’autre, vos requĂȘtes cessent d’ĂȘtre indĂ©pendantes les unes des autres, et c’est lĂ  que commence votre troisiĂšme question. PHP n’a ni threads dans sa version standard, ni boucle d’évĂ©nements intĂ©grĂ©e. La concurrence lui vient des processus, de bibliothĂšques bĂąties sur les coroutines que le langage a ajoutĂ©es en 8.1, et de runtimes qui apportent leur propre boucle d’évĂ©nements. Chacune de ces trois rĂ©ponses convient Ă  certaines charges et Ă©choue sur d’autres, et c’est cette diffĂ©rence qu’il faut connaĂźtre avant de lui confier un service.

Beaucoup de requĂȘtes

Un worker qui attend 40 millisecondes une rĂ©ponse de la base occupe un processus pendant 40 millisecondes, et aucune autre requĂȘte ne s’en aperçoit. Tout le modĂšle tient lĂ , pour le cas ordinaire des requĂȘtes HTTP indĂ©pendantes : le pool de processus du chapitre Le runtime, oĂč chaque worker bloque sur sa requĂȘte SQL, sa lecture de cache ou son appel HTTP sortant pendant que le systĂšme d’exploitation fait tourner les autres. Un runtime Ă  boucle d’évĂ©nements comme Node.js a besoin de code asynchrone pour qu’un appel lent ne gĂšle pas toutes les connexions. PHP a prĂ©fĂ©rĂ© donner un processus Ă  chaque connexion, et le code reste synchrone.

Cette simplicitĂ© se paie en mĂ©moire, connexion par connexion. Un worker qui garde un WebSocket ouvert, qui attend la fin d’un long poll ou qui diffuse une rĂ©ponse pendant une minute immobilise un processus entier tout ce temps, et un pool de quelques centaines de processus ne tiendra jamais dix mille connexions inactives. Pour cette charge-lĂ , le modĂšle par dĂ©faut de PHP est le mauvais.

Un pĂ©age d'autoroute vu de dessus. À gauche, une rangĂ©e de cabines, un Ă©lĂ©phant dans chacune, une voiture Ă  chaque cabine ; la file derriĂšre chaque cabine est courte et ordonnĂ©e. À droite, une seule voie avec une barriĂšre automatique oĂč une longue file de voitures passe sans s'arrĂȘter, un Ă©lĂ©phant surveillant un pupitre de contrĂŽle. Les deux cĂŽtĂ©s font passer le mĂȘme nombre de voitures

Beaucoup de connexions

Pour les charges qui exigent de nombreuses connexions simultanĂ©es dans un seul processus, PHP dispose de runtimes asynchrones, et ce sont des bibliothĂšques ou des extensions, pas des fonctionnalitĂ©s du langage. Par ordre alphabĂ©tique : AMPHP, un ensemble de bibliothĂšques non bloquantes construites sur une boucle d’évĂ©nements et sur les fibers du langage ; ReactPHP, un ensemble de bibliothĂšques bas niveau pilotĂ©es par les Ă©vĂ©nements, avec sa propre boucle, son serveur HTTP et ses composants de flux ; Swoole enfin, ou son fork OpenSwoole, une extension en C qui donne Ă  PHP une boucle d’évĂ©nements, des coroutines et un serveur HTTP et WebSocket intĂ©grĂ©, avec des appels d’entrĂ©es-sorties qui rendent la main au lieu de bloquer. FrankenPHP et RoadRunner, les runtimes worker du chapitre Le runtime, ne figurent pas dans cette liste parce qu’ils rĂ©pondent Ă  un autre besoin : ils gardent l’application chargĂ©e entre deux requĂȘtes, toujours une requĂȘte Ă  la fois par worker, et ne rendent pas le code concurrent.

Sous les deux premiers se trouve la Fiber, arrivĂ©e en PHP 8.1 : une fonction capable de se suspendre elle-mĂȘme, et que celui qui la tient peut reprendre plus tard. La RFC qui l’a introduite dit trĂšs prĂ©cisĂ©ment ce qu’elle n’est pas : « toutes les fibers vivent dans un seul thread, une seule fiber s’exĂ©cute Ă  la fois », et « le code bloquant, comme file_get_contents(), continuera de bloquer le processus entier, mĂȘme si d’autres fibers existent ». Le langage ne fournit aucun ordonnanceur. C’est une bibliothĂšque qui l’apporte, et chaque appel d’entrĂ©e-sortie du programme doit passer par elle pour rendre la main. Une application PHP asynchrone s’écrit donc contre le client HTTP, le client de base de donnĂ©es et les fonctions de fichiers d’AMPHP ou de ReactPHP, et non contre les fonctions standard. Une seule bibliothĂšque synchrone glissĂ©e par mĂ©garde dans les dĂ©pendances bloque toute la boucle.

Jusqu’oĂč une boucle d’évĂ©nements porte PHP, le test plaintext du benchmark multi-langages le montre : il ne fait aucun travail applicatif et mesure seulement combien de connexions en pipeline une couche HTTP sait servir.

TechEmpower Round 23, test plaintext, milliers de requĂȘtes par seconde Barres horizontales, sĂ©lection d'entrĂ©es : may-minihttp (Rust) 27 906, asp.net core (C#) 11 509, swoole (PHP) 3 519, micronaut (Java) 2 884, gin (Go) 1 640, nodejs 1 460, spring (Java) 833, fiber (Go) 646, php sur PHP-FPM 450, fastapi (Python) 338, php sur FrankenPHP 312, express (Node.js) 280, django (Python) 180, rails (Ruby) 139, laravel sur PHP-FPM 27 TechEmpower Round 23, test plaintext, milliers de requĂȘtes par seconde may-minihttp (Rust) 27 906 asp.net core (C#) 11 509 swoole (PHP) 3 519 micronaut (Java) 2 884 gin (Go) 1 640 nodejs 1 460 spring (Java) 833 fiber (Go) 646 php, PHP-FPM + nginx 450 fastapi (Python) 338 php, FrankenPHP 312 express (Node.js) 280 django (Python) 180 rails (Ruby) 139 laravel, PHP-FPM 27 TechEmpower Framework Benchmarks, Round 23 (24 fĂ©vrier 2025), test plaintext avec pipelining HTTP, jusqu'Ă  16 384 connexions simultanĂ©es. SĂ©lection de 15 entrĂ©es sur 514. Plaintext mesure la couche HTTP et la gestion des connexions, sans travail applicatif. En bleu : entrĂ©es PHP.

L’entrĂ©e Swoole sert 3,5 millions de requĂȘtes par seconde, devant Micronaut, Gin, Node.js et Spring, quand PHP nu sous PHP-FPM en sert 450 000 et Laravel sous PHP-FPM 27 000. Le plafond est ailleurs : ASP.NET Core Ă  11,5 millions, et tout en haut un serveur Python adossĂ© Ă  du C et un serveur Rust, autour de 28 millions. Avec une boucle d’évĂ©nements, PHP joue dans le deuxiĂšme groupe, pas dans le premier. Sans, il joue dans le quatriĂšme.

Beaucoup de cƓurs

Le programme spectral-norm le plus rapide en PHP dans le Benchmarks Game termine en 18 secondes de temps rĂ©el pour 72 secondes de CPU rĂ©parties sur plusieurs cƓurs, contre 90 secondes pour le meilleur programme Python et 1,6 seconde pour Node.js. Cet Ă©cart entre temps CPU et temps rĂ©el, c’est Ă  cela que ressemble le calcul parallĂšle en PHP, et une fois de plus il vient des processus. L’interprĂ©teur en ligne de commande forke avec pcntl_fork(), lance des sous-processus avec proc_open() ou fait tourner plusieurs scripts sous un superviseur, et les rĂ©sultats reviennent par des tubes, des fichiers, une base ou une file d’attente. L’extension parallel propose bien des threads, mais sur la version thread-safe de l’interprĂ©teur, que peu de distributions livrent. Le parallĂ©lisme par fork fonctionne, et il fonctionne dans la classe de vitesse de l’interprĂ©teur dĂ©crite dans DĂ©bit et latence.

L’ordonnanceur entrera-t-il un jour dans le moteur ? La question est ouverte sur la liste internals. Une RFC intitulĂ©e « Concurrency Support in the PHP Engine », qui ajouterait un ordonnanceur et de la concurrence structurĂ©e au langage lui-mĂȘme, y Ă©tait en discussion au moment oĂč j’écris, sans vote, aprĂšs qu’une premiĂšre proposition sur le mĂȘme sujet a Ă©tĂ© abandonnĂ©e en juillet 2026. En septembre 2026, le langage a des fibers, et l’ordonnanceur est une bibliothĂšque.

Ce qui ne doit pas faire attendre l’utilisateur

La concurrence dont vous aurez besoin le plus souvent n’a rien de spectaculaire : c’est le travail que l’utilisateur ne devrait pas avoir Ă  attendre. Une requĂȘte a une durĂ©e limite et une rĂ©ponse Ă  rendre, donc tout ce qui prend plus de temps doit en sortir. L’idiome, c’est une file d’attente et un processus worker. La requĂȘte dĂ©pose un travail dans une table ou un courtier de messages, puis rĂ©pond. De son cĂŽtĂ©, un script PHP en ligne de commande, maintenu en vie par un superviseur, dĂ©pile la file et exĂ©cute les travaux un par un. Ce script n’a ni limite de temps ni limite de mĂ©moire tant que vous ne lui en donnez pas, alors un worker de production fixe les deux et s’arrĂȘte proprement aprĂšs quelques milliers de travaux, pour que le superviseur relance un processus neuf. La plupart des frameworks full-stack livrent ce schĂ©ma avec un pilote pour les courtiers habituels, et cron couvre les tĂąches planifiĂ©es.

La limite : la concurrence de PHP est Ă  gros grain. Des processus pour les requĂȘtes, des processus pour les cƓurs, une file d’attente pour le travail en arriĂšre-plan, et un runtime Ă  part, avec ses propres bibliothĂšques d’entrĂ©es-sorties, pour le cas des connexions nombreuses. Si votre produit est un service temps rĂ©el avec des dizaines de milliers de connexions ouvertes, vous passerez votre premier mois Ă  choisir puis Ă  apprendre l’un des runtimes asynchrones, et vous dĂ©couvrirez que la plupart des bibliothĂšques de l’écosystĂšme n’ont pas Ă©tĂ© Ă©crites pour lui. Si votre produit est fait de requĂȘtes et de rĂ©ponses, vous ne rencontrerez jamais la question.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Prenez le scĂ©nario Ă  connexions nombreuses que vous avez vraiment, si vous en avez un, et Ă©crivez-le deux fois dans l’aprĂšs-midi : une fois avec AMPHP ou ReactPHP, une fois avec Swoole ou OpenSwoole. Comptez ensuite combien des bibliothĂšques dont vous dĂ©pendriez offrent un client non bloquant. Si c’est la plupart, la voie asynchrone vous est ouverte. Si elles sont rares, la conclusion honnĂȘte est que PHP est le mauvais outil pour ce service-lĂ , et le reste de votre systĂšme est une dĂ©cision Ă  part.

Reste Ă  savoir si le langage lui-mĂȘme est de ceux que vous auriez envie d’écrire, et cette question-lĂ , vous y rĂ©pondez en le lisant.

Le langage en 2026

Est-ce un langage que vous auriez envie d’écrire pendant quelques annĂ©es ? Aucun benchmark ne rĂ©pond Ă  cela ; vous y rĂ©pondez en lisant du code. PHP est aujourd’hui un langage orientĂ© objet, avec ramasse-miettes, aux types dĂ©clarĂ©s et appliquĂ©s Ă  l’exĂ©cution aux frontiĂšres des fonctions et des propriĂ©tĂ©s, dotĂ© d’énumĂ©rations, d’immutabilitĂ©, de closures, d’attributs et d’un gestionnaire de paquets. Un exemple suffit pour le juger, et chaque construction plus jeune que 2022 porte la version qui l’a introduite, pour que vous sachiez ce qu’un projet donnĂ© peut utiliser.

Un exemple complet

<?php
declare(strict_types=1);

enum Status: string
{
    case Draft = 'draft';
    case Published = 'published';
    case Archived = 'archived';

    public function isVisible(): bool
    {
        return $this === self::Published;
    }
}

final readonly class Article
{
    public function __construct(
        public string $title,
        public Status $status,
        public ?\DateTimeImmutable $publishedAt = null,
    ) {
    }

    public function publish(\DateTimeImmutable $at): static
    {
        return new static($this->title, Status::Published, $at);
    }
}

function summary(Article ...$articles): string
{
    $visible = array_filter($articles, fn (Article $a): bool => $a->status->isVisible());
    $titles = array_map(fn (Article $a): string => $a->title, $visible);

    return match (count($titles)) {
        0 => 'nothing published',
        1 => $titles[array_key_first($titles)],
        default => implode(', ', $titles),
    };
}

$draft = new Article(title: 'Benchmarks', status: Status::Draft);
$live = $draft->publish(new \DateTimeImmutable('2026-09-01'));

echo summary($draft, $live), PHP_EOL;   // Benchmarks
echo $draft->status->value, PHP_EOL;    // draft

Lisez-le comme vous liriez une pull request. declare(strict_types=1) passe le fichier en typage strict : une chaĂźne passĂ©e lĂ  oĂč un int est dĂ©clarĂ© lĂšve une TypeError au lieu d’ĂȘtre convertie. L’interrupteur agit fichier par fichier, et un projet l’active dans chacun. L’enum est une vraie Ă©numĂ©ration, un ensemble fermĂ© d’objets singletons qui peuvent porter des mĂ©thodes et une valeur sous-jacente. La classe readonly (PHP 8.2) rend chaque propriĂ©tĂ© immuable aprĂšs construction, et son constructeur dĂ©clare et affecte ces propriĂ©tĂ©s en un seul endroit.

Le reste de la syntaxe, vous le connaissez dĂ©jĂ  par d’autres langages : les arguments nommĂ©s Ă  l’appel, ? pour les types nullables, static comme type de retour, fn pour les closures d’une ligne, et un match qui compare strictement, ne tombe jamais dans la branche suivante et lĂšve une exception quand aucune branche ne correspond.

Ce que l’exemple ne montre pas compte tout autant. Chaque frontiĂšre y est typĂ©e, alors que le langage ne l’exige pas ; la lecture d’une variable non dĂ©finie est un avertissement en PHP 8, et les analyseurs statiques en font une erreur. Le signe $ sur les variables et la flĂšche -> pour l’accĂšs aux membres sont les deux morceaux de syntaxe qui paraissent Ă©trangers Ă  tout le monde, et au bout d’une heure on ne les voit plus.

Les ajouts récents

Les deux derniĂšres versions ont changĂ© la façon d’écrire le code, et un projet sur PHP 8.4 ou plus rĂ©cent utilisera ce qu’elles ont apportĂ©.

// PHP 8.4
final class Money
{
    public function __construct(
        public private(set) int $cents,
        public string $currency,
    ) {
    }

    public string $formatted {
        get => number_format($this->cents / 100, 2) . ' ' . $this->currency;
    }
}

$price = new Money(1999, 'EUR');
echo $price->formatted, PHP_EOL;     // 19.99 EUR
$price->cents = 5;                   // Error: Cannot modify private(set) property Money::$cents

public private(set) est la visibilitĂ© asymĂ©trique (PHP 8.4) : la propriĂ©tĂ© se lit de partout et ne s’écrit que depuis l’intĂ©rieur de la classe, ce qui supprime la plupart des getters qu’un dĂ©veloppeur Java ou C# s’attend Ă  Ă©crire. Le bloc get sous $formatted est un hook de propriĂ©tĂ© (PHP 8.4), une logique attachĂ©e Ă  une propriĂ©tĂ© sans changer ses sites d’appel, et cela supprime la plupart des autres. L’opĂ©rateur pipe (PHP 8.5) enchaĂźne les fonctions de gauche Ă  droite :

// PHP 8.5
$slug = '  Hello, World  '
    |> trim(...)
    |> strtolower(...)
    |> (fn (string $s): string => preg_replace('/[^a-z0-9]+/', '-', $s))
    |> (fn (string $s): string => trim($s, '-'));

echo $slug, PHP_EOL;   // hello-world

La forme trim(...) est un callable de premiĂšre classe (PHP 8.1), une rĂ©fĂ©rence Ă  une fonction sous forme de valeur, avec l’aritĂ© vĂ©rifiĂ©e par le moteur. Ajoutez les attributs, des mĂ©tadonnĂ©es structurĂ©es lues par rĂ©flexion et utilisĂ©es par tous les frameworks pour le routage, la validation et le mapping, et vous avez les constructions que vous croiserez le plus dans une base de code dĂ©marrĂ©e aprĂšs 2024.

Deux listings de code cÎte à cÎte sur un bureau, vus de dessus. Celui de gauche est sur du papier jauni, dense, avec quelques taches de café et des soulignements ondulés. Celui de droite est sur une feuille blanche propre, plus court, avec une indentation nette et quelques annotations de type surlignées. Un petit éléphant lit la feuille de droite, un stylo à la main

Ce que le systĂšme de types fait et ne fait pas

Les types sont dĂ©clarĂ©s sur les paramĂštres, les valeurs de retour, les propriĂ©tĂ©s et les constantes de classe, et le moteur les applique Ă  l’exĂ©cution. Les types union (int|string), les types intersection (Countable&Traversable), les types nullables, never, mixed et les Ă©numĂ©rations font tous partie du langage. Une erreur de type est une exception, pas un avertissement, et en mode strict il n’y a aucune coercition implicite entre scalaires, Ă  l’exception de l’élargissement d’un int en float.

Ce qui manque, autant l’entendre de moi maintenant que le dĂ©couvrir la troisiĂšme semaine. Il n’y a pas de gĂ©nĂ©riques dans le langage. Un list<Order> ne peut pas s’exprimer dans une signature ; le paramĂštre est array. L’écosystĂšme rĂ©pond par une syntaxe de docblock que les deux analyseurs statiques, PHPStan et Psalm, comprennent et appliquent. @param list<Order> $orders est vĂ©rifiĂ© au moment de l’analyse, dans l’éditeur et en intĂ©gration continue, avec les types template, les types conditionnels et les types de forme, plus riches que tout ce que le langage lui-mĂȘme sait exprimer ; un projet PHP typĂ© exĂ©cute donc un analyseur Ă  son niveau le plus strict Ă  chaque build et traite sa sortie comme des erreurs de compilation. Que ce soit un substitut acceptable Ă  des gĂ©nĂ©riques dans le langage, c’est Ă  vous d’en juger, selon vos propres habitudes. C’est un substitut, et vous devriez le peser comme tel.

L’autre absence vient du runtime plutĂŽt que du langage : pas de threads en userland ni de boucle d’évĂ©nements intĂ©grĂ©e. Concurrence dĂ©crit ce qui existe Ă  la place.

La bibliothĂšque standard

strpos voisine avec str_replace, array_key_exists avec in_array, et certaines fonctions prennent l’aiguille en premier quand d’autres prennent la botte de foin. Cette incohĂ©rence est historique, elle est rĂ©elle, et elle ne disparaĂźtra pas. Depuis PHP 8.0, les nouvelles fonctions suivent un seul schĂ©ma de nommage (str_contains, array_is_list, array_find), les fonctions internes lĂšvent TypeError et ValueError sur une entrĂ©e invalide au lieu de retourner false, et tout Ă©diteur dotĂ© d’un serveur de langage PHP complĂšte les noms ; c’est ainsi qu’une Ă©quipe vit avec le reste. La seconde verrue, ce sont les chaĂźnes, qui sont des suites d’octets : strlen('Ă©') vaut 2, et le traitement du texte passe par la famille mb_. VoilĂ  les deux que vous rencontrerez en premier.

La limite : le systĂšme de types de PHP est appliquĂ© Ă  l’exĂ©cution et aux frontiĂšres des fonctions et des propriĂ©tĂ©s, pas Ă  l’intĂ©rieur des expressions ni Ă  travers les conteneurs gĂ©nĂ©riques. Une Ă©quipe qui veut des garanties Ă  la compilation sur ses collections les obtient d’un analyseur statique, pas du langage.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Installez PHP 8.5 (votre gestionnaire de paquets, ou l’image Docker officielle php:8.5-cli), collez le premier exemple dans un fichier et lancez-le avec php file.php. Puis cassez-le : passez une chaĂźne lĂ  oĂč l’énumĂ©ration Status est attendue, retirez strict_types, Ă©crivez un match sur l’énumĂ©ration en oubliant un cas, puis appelez-le avec ce cas. Les messages d’erreur sont la partie d’un langage avec laquelle on vit, et cinq minutes suffisent pour les juger. Pour le systĂšme de types, lancez PHPStan ou Psalm Ă  son niveau le plus strict sur n’importe quel projet PHP open source d’une taille qui vous parle, et lisez les vingt premiers rĂ©sultats ; ils vous montrent ce que l’analyseur attrape et que le moteur laisse passer.

L’écosystĂšme

Personne n’adopte un langage seul ; on adopte avec lui ses bibliothĂšques, ses outils et ses conventions, et votre question est de savoir si ceux de PHP tiennent la comparaison avec ce que npm, pip ou Maven vous donnent ailleurs. PHP a un gestionnaire de paquets, un registre public, un organisme d’interopĂ©rabilitĂ© qui publie des standards plutĂŽt que des produits, et au moins deux options mĂ»res dans chaque catĂ©gorie d’outillage, dont aucune n’est cautionnĂ©e par le langage lui-mĂȘme. La taille et l’activitĂ© se mesurent, et les chiffres sont ici ; la qualitĂ©, je ne peux que vous la dĂ©signer du doigt.

Composer et Packagist

Composer est le gestionnaire de dĂ©pendances, et il n’y en a pas de second. Il lit un composer.json, rĂ©sout les versions selon des contraintes de versionnage sĂ©mantique, Ă©crit un composer.lock qui fige chaque dĂ©pendance transitive, et gĂ©nĂšre l’autoloader qui fait correspondre les noms de classes aux fichiers selon le standard PSR-4. Packagist, son registre par dĂ©faut, listait 468 099 paquets et 5,8 millions de versions de paquets le 17 septembre 2026, et avait enregistrĂ© 199,6 milliards d’installations de paquets depuis avril 2012.

Installations de paquets via Composer, milliards par an Courbe : 2016 2,0 milliards, 2017 3,6, 2018 5,2, 2019 7,8, 2020 12,3, 2021 18,0, 2022 23,4, 2023 24,6, 2024 31,0, 2025 36,0 Installations de paquets via Composer, milliards par an 0 10 20 30 40 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 installations (36) packagist.org/statistics, installations mensuelles sommées par année civile. Relevé le 17 septembre 2026. Une installation est un paquet installé par Composer et signalé à packagist.org ; l'intégration continue et les images de conteneurs y pÚsent lourd.

Les installations via Composer sont passĂ©es de 2,0 milliards en 2016 Ă  36,0 milliards en 2025, et le seul mois d’aoĂ»t 2026 en a enregistrĂ© 4,9 milliards, 91 % de plus qu’en aoĂ»t 2025. C’est le signal d’activitĂ©, et sa dĂ©finition appelle une rĂ©serve : une installation est un paquet installĂ© par Composer et signalĂ© au registre, si bien que les pipelines d’intĂ©gration continue et les builds d’images de conteneurs en reprĂ©sentent une part large et inconnue. La courbe dit que les projets PHP sont construits, testĂ©s et dĂ©ployĂ©s en nombre croissant. Elle ne compte pas les projets, et vous ne pouvez pas non plus mettre le nombre de paquets d’un registre en face de celui d’un autre, parce que ce qu’on appelle un « paquet » diffĂšre d’un Ă©cosystĂšme Ă  l’autre.

Depuis Composer 2.4, sorti en aoĂ»t 2022, composer audit confronte chaque paquet installĂ© aux avis de sĂ©curitĂ© que Packagist sert par son API, et fait Ă©chouer le build quand il trouve une vulnĂ©rabilitĂ© connue, un paquet abandonnĂ© ou un paquet signalĂ© comme malveillant. Les avis viennent de la base partagĂ©e de l’écosystĂšme, qui en contenait 1 649 en septembre 2026. Les extensions Ă©crites en C, que Composer n’a jamais gĂ©rĂ©es, ont reçu leur propre installeur en 2025 et 2026 : PIE, le PHP Installer for Extensions, financĂ© par une subvention publique et hĂ©bergĂ© sous l’organisation php.

Un tapis roulant livre des caisses en bois Ă©tiquetĂ©es Ă  un Ă©tabli oĂč un Ă©lĂ©phant assemble une machine avec leur contenu. Au mur est accrochĂ© un porte-bloc qui liste chaque caisse, avec un petit cadenas dessinĂ© Ă  cĂŽtĂ© de la liste. Un second Ă©lĂ©phant contrĂŽle chaque caisse qui arrive contre le porte-bloc avant qu'elle n'atteigne l'Ă©tabli

Frameworks et plateformes

Les frameworks full-stack en dĂ©veloppement actif sont CakePHP, Laminas, Laravel, Symfony et Yii ; les micro-frameworks, Mezzio et Slim ; les plateformes de contenu, Drupal, Joomla, TYPO3 et WordPress ; les plateformes de commerce, Adobe Commerce avec son Ă©dition Magento Open Source, PrestaShop, Shopware, Sylius et WooCommerce. L’ordre est alphabĂ©tique d’un bout Ă  l’autre, et je n’en recommande aucun.

Ce qu’ils sont les uns pour les autres, en revanche, se dit avec une source. Symfony publie la liste des projets construits sur ses composants, et elle compte Drupal, Joomla, TYPO3, Magento, PrestaShop, Shopware et Sylius, ainsi que Composer lui-mĂȘme. Ces composants, et ceux de Laravel, sont ce que vous trouverez sous la plupart des plateformes du chapitre Empreinte, WordPress exceptĂ©, et c’est pour cela que l’écosystĂšme est moins fragmentĂ© qu’une liste de noms ne le laisse croire. Les chiffres d’usage viennent d’une enquĂȘte : parmi les dĂ©veloppeurs qui citent PHP comme langage principal, 64 % dĂ©clarent utiliser Laravel, 25 % WordPress et 23 % Symfony, plusieurs rĂ©ponses Ă©tant permises. L’échantillon penche vers les clients de l’éditeur, alors lisez cela comme des rĂ©ponses d’enquĂȘte, pas comme un classement que je cautionne.

Outillage

Chaque catĂ©gorie a au moins deux options maintenues, et un aprĂšs-midi avec chacune est la bonne façon de choisir. Pour les tests, Pest et PHPUnit. Pour l’analyse statique, PHPStan et Psalm, qui lisent tous deux une syntaxe de types en docblock plus riche que le langage et appliquent les gĂ©nĂ©riques, les formes et les types conditionnels que le moteur ne connaĂźt pas. Pour le style de code, PHP-CS-Fixer et PHP_CodeSniffer, tous deux capables d’appliquer le standard PER Coding Style. Pour l’édition, PhpStorm et VS Code avec une extension PHP, chacun avec un serveur de langage ; pour servir, FrankenPHP, PHP-FPM derriĂšre un serveur web et RoadRunner. Deux outils sont seuls dans leur catĂ©gorie : Xdebug, le dĂ©bogueur, qui profile aussi, et Rector, qui réécrit le code vers une syntaxe plus rĂ©cente et qui est le moyen de faire passer une grande base de code d’une version de PHP Ă  l’autre.

Quelle part de cet outillage est rĂ©ellement utilisĂ©e est une autre affaire, et le chiffre d’enquĂȘte sur ce point est le moins flatteur de ce chapitre.

Outils que les dĂ©veloppeurs PHP dĂ©clarent utiliser Barres horizontales, part des rĂ©pondants : PHPUnit 50 pour cent, PHPStan 36, PHP-CS-Fixer 30, Pest 17 ; 32 pour cent n'Ă©crivent pas de tests et 42 pour cent n'utilisent aucun outil qualitĂ© rĂ©guliĂšrement Outils que les dĂ©veloppeurs PHP dĂ©clarent utiliser PHPUnit 50% PHPStan 36% PHP-CS-Fixer 30% Pest 17% n'Ă©crit pas de tests 32% aucun outil qualitĂ© rĂ©gulier 42% JetBrains, The State of PHP 2025 (octobre 2025), 1 720 rĂ©pondants ayant PHP comme langage principal, issus de l'enquĂȘte Developer Ecosystem. Plusieurs rĂ©ponses par rĂ©pondant. Échantillon orientĂ© vers les utilisateurs JetBrains.

La moitiĂ© des dĂ©veloppeurs PHP de l’échantillon JetBrains utilisent PHPUnit, un tiers utilisent PHPStan, et un tiers n’écrivent aucun test ; 42 % n’utilisent rĂ©guliĂšrement aucun outil de qualitĂ© de code. Est-ce pire que dans d’autres Ă©cosystĂšmes, l’enquĂȘte ne le dit pas, et je ne le devinerai pas. L’outillage existe ; qu’il soit utilisĂ© est une propriĂ©tĂ© de l’équipe, pas du langage.

Standards

Une bibliothĂšque qui type son logger en Psr\Log\LoggerInterface fonctionne sous n’importe quel framework, et c’est Ă  cela que sert le PHP Framework Interoperability Group, PHP-FIG. Il publie les standards qui permettent aux bibliothĂšques d’auteurs diffĂ©rents de s’emboĂźter : 14 PHP Standards Recommendations acceptĂ©es en septembre 2026, couvrant l’autoloading (PSR-4), la journalisation (PSR-3), les messages et gestionnaires HTTP (PSR-7, 15, 17), le cache (PSR-6, 16), les conteneurs (PSR-11), les Ă©vĂ©nements (PSR-14) et les horloges (PSR-20), plus le PER Coding Style, en version 3.1, qui a remplacĂ© PSR-12 comme standard de codage.

La distribution du langage lui-mĂȘme est la derniĂšre piĂšce. php.net publie des archives sources signĂ©es par les release managers depuis 2012, avec leurs sommes de contrĂŽle ; les images Docker officielles php:8.5-cli et php:8.5-fpm suivent chaque version ; et les distributions Linux grand public empaquettent une version qu’elles corrigent elles-mĂȘmes, qui n’est pas toujours une version que php.net maintient encore.

La limite : l’écosystĂšme est un Ă©cosystĂšme web. Sa profondeur en HTTP, gabarits, ORM, files d’attente, paiement et contenu n’a pas d’équivalent en calcul numĂ©rique, apprentissage automatique, pipelines de donnĂ©es ou applications de bureau et mobiles, oĂč les paquets sont rares et la communautĂ© petite. Si votre produit en a besoin, vous utiliserez un autre langage pour cette partie, et LĂ  oĂč PHP est le mauvais choix le dit en dĂ©tail.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Lancez composer create-project avec le squelette du framework de votre choix, puis composer audit, et lisez le fichier lock produit ; toute la chaĂźne d’approvisionnement est devant vous en dix minutes. Cherchez ensuite sur Packagist les trois bibliothĂšques dont votre projet ne peut pas se passer, et regardez la date de leur derniĂšre version et le nombre de leurs tickets ouverts. Cette vĂ©rification vous en apprend plus que le nombre de paquets.

Sous tout cela tourne un interprĂ©teur, et qui l’entretient est une question Ă  part entiĂšre.

Gouvernance et pérennité

Avant de miser une base de code sur quoi que ce soit, vous voulez savoir qui dĂ©cide de ce qui y entre, qui est payĂ© pour l’entretenir, et combien de temps une version reste maintenue. PHP Ă©volue par un processus de RFC public avec un vote aux deux tiers, livre une version mineure chaque annĂ©e et maintient chacune pendant quatre ans, et dispose depuis 2021 d’une fondation qui contractualise treize ingĂ©nieurs et a signĂ© 42 % des commits de l’interprĂ©teur en 2025. L’argent derriĂšre cette fondation est infĂ©rieur Ă  un million de dollars par an, et ce chiffre fait autant partie de la rĂ©ponse que le reste.

Comment un changement entre

Chaque changement du langage passe par une Request for Comments sur wiki.php.net. La proposition est Ă©crite, discutĂ©e pendant au moins deux semaines sur la liste de diffusion internals, puis soumise Ă  un vote ouvert pendant au moins deux semaines, et elle ne passe qu’avec les deux tiers des voix exprimĂ©es ; les votants sont les contributeurs qui disposent d’un compte php.net et un petit nombre de reprĂ©sentants de la communautĂ©, et la rĂšgle des deux tiers est stricte depuis fĂ©vrier 2019. Chaque Ă©tape est publique, jusqu’aux votes exprimĂ©s nominativement.

Les types intersection nullables ont Ă©tĂ© rejetĂ©s 12 Ă  26 en 2021. Les closures multi-instructions Ă  capture automatique ont obtenu une majoritĂ© de 27 Ă  16 en 2022 et ont Ă©tĂ© refusĂ©es quand mĂȘme, faute d’atteindre la barre des deux tiers. La visibilitĂ© asymĂ©trique a Ă©tĂ© refusĂ©e 14 Ă  12 en janvier 2023, rĂ©visĂ©e, acceptĂ©e 24 Ă  7 en aoĂ»t 2024 et livrĂ©e dans PHP 8.4, et les classes imbriquĂ©es ont Ă©tĂ© refusĂ©es 2 Ă  20 en mai 2025. Cette liste de refus est la preuve que le processus est rĂ©el.

Le rythme se lit dans un index secondaire : 31 RFC pour PHP 8.4, 19 pour PHP 8.5, et dĂ©jĂ  29 listĂ©es pour PHP 8.6 en septembre 2026. Si vous venez d’un langage pilotĂ© par un seul Ă©diteur ou par un dictateur bienveillant, pesez ce que cela signifie : rien n’entre dans PHP parce que quelqu’un d’important le veut, et des fonctionnalitĂ©s qu’une majoritĂ© voulait ont Ă©tĂ© refusĂ©es. Le processus est lent, et il est public.

Une table ronde vue de dessus, avec une douzaine d'éléphants assis autour. Un document repose au centre. La plupart des éléphants lÚvent une main ; quelques-uns gardent les deux sur la table. Au mur, une jauge horizontale avec un repÚre aux deux tiers de sa longueur, et le niveau de la jauge juste au-delà du repÚre

Le calendrier des versions

Depuis dĂ©cembre 2015, PHP livre une version mineure chaque annĂ©e, onze d’affilĂ©e, chacune entre le 20 novembre et le 8 dĂ©cembre. Chaque branche reçoit ensuite deux ans de support actif, avec des corrections de bugs et de sĂ©curitĂ© dans des versions correctives mensuelles, puis deux ans de corrections de sĂ©curitĂ© seulement. Depuis une RFC votĂ©e en avril 2024, les deux fenĂȘtres se terminent le 31 dĂ©cembre de leur derniĂšre annĂ©e, ce qui vous permet de planifier vos mises Ă  niveau par annĂ©e civile.

FenĂȘtres de support des branches PHP Barres chronologiques : PHP 8.1 de novembre 2021, support actif jusqu'en novembre 2023, sĂ©curitĂ© jusqu'en dĂ©cembre 2025 ; 8.2 de dĂ©cembre 2022, actif jusqu'en dĂ©cembre 2024, sĂ©curitĂ© jusqu'en dĂ©cembre 2026 ; 8.3 de novembre 2023 Ă  dĂ©cembre 2025 et dĂ©cembre 2027 ; 8.4 de novembre 2024 Ă  dĂ©cembre 2026 et dĂ©cembre 2028 ; 8.5 de novembre 2025 Ă  dĂ©cembre 2027 et dĂ©cembre 2029 ; 8.6 prĂ©vue pour novembre 2026. FenĂȘtres de support des branches PHP 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 septembre 2026 PHP 8.1 PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5 8.6 (prĂ©vue) support actif (bugs et sĂ©curitĂ©) correctifs de sĂ©curitĂ© seulement php.net/supported-versions et php.net/eol, relevĂ©s le 17 septembre 2026. Dates de PHP 8.6 d'aprĂšs wiki.php.net/todo/php86, prĂ©vues, pas publiĂ©es.

En septembre 2026, quatre branches sont maintenues : PHP 8.2 en support de sĂ©curitĂ© jusqu’au 31 dĂ©cembre 2026, 8.3 jusqu’à la fin 2027, 8.4 en support actif jusqu’à la fin 2026, et 8.5 en support actif jusqu’à la fin 2027. PHP 8.6 est prĂ©vu en disponibilitĂ© gĂ©nĂ©rale le 19 novembre 2026, avec son gel des fonctionnalitĂ©s en aoĂ»t, des release candidates Ă  partir du 24 septembre et trois release managers nommĂ©s. Aucune date n’existe pour un PHP 9.0, et je n’en donne aucune. Les versions de PHP, 2015 Ă  2026 liste chaque version avec ses dates.

DerriĂšre le calendrier, le dĂ©pĂŽt montre l’activitĂ©. Dans les douze mois jusqu’au 17 septembre 2026, la branche principale de php-src a reçu 5 316 commits de 171 auteurs distincts, et le dĂ©pĂŽt compte 1 644 contributeurs sur un historique GitHub qui commence en 2011.

Qui est payé

Jusqu’en 2021, l’interprĂ©teur Ă©tait entretenu par des bĂ©nĂ©voles et par une poignĂ©e d’ingĂ©nieurs employĂ©s par des entreprises ayant un intĂ©rĂȘt dans PHP. En novembre 2021, quand l’un des dĂ©veloppeurs du cƓur les plus actifs a annoncĂ© qu’il s’éloignait de ce travail, dix entreprises ont créé The PHP Foundation pour financer directement le dĂ©veloppement du cƓur : Acquia, Automattic, Craft CMS, JetBrains, Laravel, PrestaShop, Private Packagist, Symfony, Tideways et Zend by Perforce. La fondation est hĂ©bergĂ©e fiscalement par Open Source Collective, liste chaque transaction sur sa page Open Collective et publie un rapport de transparence chaque annĂ©e.

La PHP Foundation, milliers de dollars par an Deux courbes. Contributions reçues : 2022 712, 2023 419, 2024 684, 2025 731. Dépensé pour les ingénieurs : 2022 133 (avril à novembre), 2023 275, 2024 635, 2025 784 (dépenses totales). La PHP Foundation, milliers de dollars par an 0 200 400 600 800 2022 2023 2024 2025 dépensé (784) contributions reçues (731) Rapports de transparence de la PHP Foundation pour 2022, 2023, 2024 et 2025 (publiés en novembre 2022, février 2024, mars 2025, mai 2026). Les dépenses 2022 couvrent avril à novembre seulement ; les dépenses 2025 sont le total publié, avec un déficit d'environ 139 000 dollars présenté comme délibéré.

Les contributions ont Ă©tĂ© de 712 000 dollars en 2022, 419 000 en 2023, 684 000 en 2024 et 731 000 en 2025. Les dĂ©penses en ingĂ©nieurs sont passĂ©es de 275 000 dollars en 2023 Ă  635 000 en 2024 et 784 000 en 2025, une annĂ©e que la fondation a close sur un dĂ©ficit qu’elle dĂ©crit comme dĂ©libĂ©rĂ©. VoilĂ  l’échelle, et ce sont les rapports eux-mĂȘmes qui la donnent.

Ce que cet argent achĂšte, en septembre 2026, c’est treize ingĂ©nieurs Ă  temps plein ou partiel sous contrat, un directeur exĂ©cutif et un conseil de dix membres non rĂ©munĂ©rĂ©s ; ces ingĂ©nieurs ont signĂ© 42 % des commits de php-src et 32 % des pull requests fusionnĂ©es en 2025. Deux subventions publiques s’ajoutent Ă  l’argent des sponsors. La Sovereign Tech Agency allemande a financĂ© 205 000 euros de travaux en 2023 et 2024 et 223 680 euros en 2025 et 2026, et une subvention d’Alpha-Omega, un projet de la Linux Foundation, finance une Ă©quipe de sĂ©curitĂ© de l’écosystĂšme depuis mai 2026.

La dĂ©pendance est dans les mĂȘmes rapports. Deux sponsors, Automattic et JetBrains, reprĂ©sentent respectivement 762 500 et 476 670 dollars des 3,37 millions de dollars enregistrĂ©s sur la page Open Collective de la fondation depuis novembre 2021, soit environ 37 % Ă  eux deux ; ce total cumulĂ© et les rapports annuels n’ont pas le mĂȘme pĂ©rimĂštre, et je ne les ai pas rĂ©conciliĂ©s. Le nombre d’organisations et de particuliers sponsors est tombĂ© de 658 en 2024 Ă  536 en 2025, ce que la fondation elle-mĂȘme qualifie de « nettement moins ». Un budget infĂ©rieur Ă  un million de dollars est petit pour un langage de l’empreinte dĂ©crite dans Empreinte : il paie une douzaine d’ingĂ©nieurs, pas un groupe de recherche. Chacun de ces chiffres, c’est la fondation qui le publie.

Sécurité

Une vulnĂ©rabilitĂ© arrive au projet par le flux d’avis privĂ©s de GitHub sur le dĂ©pĂŽt php-src ou par e-mail Ă  l’équipe de sĂ©curitĂ©. Une politique publiĂ©e la classe en sĂ©vĂ©ritĂ© haute, moyenne ou basse, et les deux classes supĂ©rieures sont corrigĂ©es dans un dĂ©pĂŽt privĂ© avant une publication coordonnĂ©e. Les tags de version sont signĂ©s par les release managers depuis avril 2012, et chaque archive est livrĂ©e avec une signature dĂ©tachĂ©e et une somme de contrĂŽle publiĂ©e. Je n’ai trouvĂ© ni nomenclature logicielle ni attestation de build pour les archives de version, et je le rapporte comme « non trouvé » plutĂŽt que comme « n’existe pas ».

Vulnérabilités publiées pour l'interpréteur PHP, par an Barres horizontales, fiches CVE du produit php:php par année de publication : 2022 8, 2023 7, 2024 18, 2025 13, 2026 au 17 septembre 14 Vulnérabilités publiées pour l'interpréteur PHP, par an 2022 8 2023 7 2024 18 2025 13 2026 (au 17 sept.) 14 NVD, fiches pour cpe:2.3:a:php:php par année de publication, interrogé le 17 septembre 2026. La liste d'avis php-src sur GitHub donne 5, 18, 14 et 15 pour 2023 à 2026. PHP n'attribue pas de CVE à la plupart des problÚmes de faible gravité ; la hausse de 2024 coïncide avec un audit externe financé. Les comptes ne se comparent pas entre langages.

L’interprĂ©teur a eu 8 vulnĂ©rabilitĂ©s publiĂ©es en 2022, 7 en 2023, 18 en 2024, 13 en 2025 et 14 en 2026 jusqu’au 17 septembre. La hausse de 2024 coĂŻncide avec un audit externe de l’interprĂ©teur, commandĂ© avec des fonds publics, qui a trouvĂ© 27 problĂšmes dont 17 avaient des implications de sĂ©curitĂ©, trois d’entre eux de sĂ©vĂ©ritĂ© haute, et qui a produit plusieurs des CVE de cette annĂ©e-lĂ . Le graphique se lit mal si l’on n’y prend garde. La politique de PHP n’attribue pas de CVE Ă  la plupart des problĂšmes de sĂ©vĂ©ritĂ© basse, donc le dĂ©compte reflĂšte la politique autant que le code. Un dĂ©compte de vulnĂ©rabilitĂ©s ne se compare pas non plus d’un langage Ă  l’autre : ce qui compte comme « le langage », un runtime, une bibliothĂšque standard, un registre de paquets, diffĂšre dans chacun, et la politique de divulgation aussi.

La limite : le langage est gouvernĂ© par ses contributeurs, financĂ© par une fondation au budget infĂ©rieur Ă  un million de dollars par an avec deux sponsors dominants, et sĂ©curisĂ© par une petite Ă©quipe et une politique qui attribue moins de CVE que d’autres ne le feraient. Ce sont les faits d’un projet communautaire, et ils sont publiĂ©s par le projet lui-mĂȘme ; si vous les comparez avec un langage adossĂ© Ă  la masse salariale d’un grand Ă©diteur, comparez les risques des deux cĂŽtĂ©s, y compris la libertĂ© de l’éditeur de changer de cap.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Ouvrez wiki.php.net/rfc et lisez une RFC actuellement en vote, puis le fil de la liste internals qui l’accompagne ; une heure passĂ©e lĂ  vous montre comment les dĂ©cisions se prennent, mieux que n’importe quelle description. Ouvrez la page Open Collective de la fondation, oĂč chaque contribution et chaque dĂ©pense est listĂ©e par date. Ouvrez les avis de sĂ©curitĂ© de php-src sur GitHub et lisez les trois plus rĂ©cents, en notant le dĂ©lai entre le signalement et le correctif.

Ce que tout cela vous coûte, en salaires, en hébergement et en mises à niveau, est la question suivante.

Coût de possession

Un langage vous coĂ»te trois choses : les gens qui l’écrivent, les machines qui l’exĂ©cutent et le calendrier que vous consacrez Ă  le tenir Ă  jour. PHP a un chiffre pour chacune, et chaque chiffre se lit de deux façons. Les dĂ©veloppeurs PHP sont nombreux et, d’aprĂšs les mĂ©dianes des enquĂȘtes elles-mĂȘmes, moins payĂ©s que ceux de la plupart des autres langages ; le runtime est celui qui compte le moins de piĂšces mobiles Ă  hĂ©berger, des fichiers servis par un pool de processus ; et la cadence annuelle des versions impose un budget de mise Ă  niveau annuel qu’une large part du parc installĂ© n’a pas payĂ©. La lecture bon marchĂ© et la lecture chĂšre sortent des mĂȘmes sources, et vous aurez besoin des deux.

Les personnes

Un dĂ©veloppeur professionnel sur cinq a Ă©crit du PHP dans l’annĂ©e. Cela le place douziĂšme parmi les langages de la plus grande enquĂȘte auprĂšs des dĂ©veloppeurs, Ă  quelques points de Go et de C.

Langages utilisĂ©s par les dĂ©veloppeurs professionnels, derniĂšre annĂ©e Barres horizontales, part des rĂ©pondants professionnels : JavaScript 68,8 pour cent, Python 54,8, TypeScript 48,8, C# 29,9, Java 29,6, PHP 19,1, Go 17,4, Rust 14,5, Ruby 6,9 Langages utilisĂ©s par les dĂ©veloppeurs professionnels, derniĂšre annĂ©e JavaScript 68,8% Python 54,8% TypeScript 48,8% C# 29,9% Java 29,6% PHP 19,1% Go 17,4% Rust 14,5% Ruby 6,9% Stack Overflow Developer Survey 2025, dĂ©veloppeurs professionnels (n = 24 759), enquĂȘte de mai Ă  juin 2025. RĂ©pondants auto-sĂ©lectionnĂ©s, recrutĂ©s via Stack Overflow. Plusieurs rĂ©ponses par rĂ©pondant.

Une autre enquĂȘte confirme l’ordre de grandeur : 17 % des rĂ©pondants de l’enquĂȘte JetBrains de 2025 ont utilisĂ© PHP, et 9 % l’ont citĂ© comme langage principal. Le marchĂ© du travail, lui, reste peu documentĂ© publiquement. Un agrĂ©gateur d’offres d’emploi britanniques a comptĂ© 613 postes permanents citant PHP sur les six mois prĂ©cĂ©dant septembre 2026, contre 404 un an plus tĂŽt, pour un salaire mĂ©dian annoncĂ© de 48 676 livres, en hausse de 14,5 %. Je n’ai trouvĂ© aucune sĂ©rie publique comparable pour d’autres pays, je n’en rapporte donc aucune.

Le chiffre de salaire qui existe est la mĂ©diane d’enquĂȘte, et elle est basse.

Salaire annuel mĂ©dian dĂ©clarĂ© par les dĂ©veloppeurs de chaque langage, dollars Barres horizontales : Erlang 100 636, Ruby 90 221, Go 76 433, Rust 76 292, Python 67 723, C# 66 066, TypeScript 65 907, JavaScript 63 694, Java 61 714, PHP 49 586 Salaire annuel mĂ©dian dĂ©clarĂ© par les dĂ©veloppeurs de chaque langage, dollars Erlang 100 636 Ruby 90 221 Go 76 433 Rust 76 292 Python 67 723 C# 66 066 TypeScript 65 907 JavaScript 63 694 Java 61 714 PHP 49 586 Stack Overflow Developer Survey 2024, « Top paying technologies », langages, mĂ©diane en dollars. L'Ă©dition 2025 n'a pas publiĂ© ce tableau. Auto-dĂ©clarĂ©, mondial, non corrigĂ© du pays. PHP Ă©tait l'avant-dernier des cinquante langages listĂ©s.

Dans la derniĂšre Ă©dition de l’enquĂȘte Stack Overflow Ă  publier des salaires par langage, les dĂ©veloppeurs utilisant PHP ont dĂ©clarĂ© une mĂ©diane de 49 586 dollars par an, la deuxiĂšme plus basse de cinquante langages, contre 63 694 pour JavaScript, 67 723 pour Python et 90 221 pour Ruby. Le chiffre est mondial et auto-dĂ©clarĂ©, et les rĂ©pondants PHP vivent plus souvent qu’à leur tour dans des pays Ă  bas salaires, si bien qu’il en dit moins sur votre ville qu’il n’y paraĂźt. Lisez-le comme un coĂ»t, et recruter en PHP revient peu cher dans l’ensemble. Lisez-le comme un signal, et le marchĂ© valorise le poste PHP mĂ©dian sous le poste mĂ©dian des autres langages. Si vous montez une Ă©quipe, il vous faut les deux lectures.

Développeurs ayant utilisé un langage et souhaitant continuer Barres horizontales, part « admired » : Rust 72,4 pour cent, TypeScript 58,0, Go 56,5, Python 56,4, C# 55,8, JavaScript 46,8, Ruby 44,3, Java 41,8, PHP 38,9 Développeurs ayant utilisé un langage et souhaitant continuer Rust 72,4% TypeScript 58% Go 56,5% Python 56,4% C# 55,8% JavaScript 46,8% Ruby 44,3% Java 41,8% PHP 38,9% Stack Overflow Developer Survey 2025, mesure « admired » (n = 31 771). Part des répondants ayant utilisé le langage dans l'année et souhaitant continuer.

Le sentiment se chiffre moins bien que le salaire. Parmi les dĂ©veloppeurs ayant utilisĂ© un langage dans l’annĂ©e, 38,9 % de ceux qui ont utilisĂ© PHP veulent continuer, le taux le plus bas des langages grand public et loin derriĂšre Rust Ă  72,4, TypeScript Ă  58,0 ou Python Ă  56,4. La mĂȘme annĂ©e, 58 % des dĂ©veloppeurs dont le langage principal est PHP disaient ne pas prĂ©voir de migrer vers un autre. Les deux chiffres dĂ©crivent des populations diffĂ©rentes, l’utilisateur occasionnel et le spĂ©cialiste, et mis cĂŽte Ă  cĂŽte ils dessinent un langage auquel on est plus souvent affectĂ© qu’attirĂ©. Pour le recrutement, cela veut dire un vivier large et une question de rĂ©tention, et c’est Ă  vous de les pondĂ©rer.

Les machines

Une application PHP en production, ce sont des fichiers sur un disque, servis par un pool de processus. Pas de processus applicatif de longue durĂ©e Ă  surveiller, redĂ©marrer ou vider, pas de prĂ©chauffage, pas de tas mĂ©moire Ă  dimensionner : c’est le modĂšle shared-nothing dĂ©crit dans Le runtime, et c’est lui qui donne Ă  PHP le moins de piĂšces mobiles Ă  hĂ©berger. VoilĂ  pourquoi tous les hĂ©bergeurs mutualisĂ©s du monde le proposent, et pourquoi les plateformes du chapitre Empreinte peuvent ĂȘtre installĂ©es par des gens qui ne sont pas ingĂ©nieurs. Pour la plupart des applications, une image de conteneur du build officiel php:8.5-fpm, un serveur web devant et un rĂ©partiteur de charge forment toute l’architecture de production, et ajouter de la capacitĂ©, c’est ajouter une copie.

Cette simplicitĂ© se paie en efficacitĂ© par machine. Dans le benchmark de DĂ©bit et latence, un framework sous PHP-FPM sert quelques dizaines de milliers de requĂȘtes par seconde sur un gros serveur ; un runtime en mode worker multiplie ce chiffre par trois Ă  quatre, et apporte avec lui la discipline opĂ©rationnelle d’un processus de longue durĂ©e. Les progrĂšs du moteur lui-mĂȘme s’inscrivent dans le mĂȘme registre. Badoo a rapportĂ© en 2017 que le passage de ses centaines de serveurs applicatifs de PHP 5 Ă  PHP 7 lui avait Ă©conomisĂ© environ un million de dollars de matĂ©riel, chiffre auto-dĂ©clarĂ© sur le blog d’ingĂ©nierie de l’entreprise. Je ne dispose d’aucune mesure indĂ©pendante du coĂ»t d’hĂ©bergement par requĂȘte d’un langage Ă  l’autre, et je n’affirme rien Ă  ce sujet.

Un livre de comptes ouvert sur un bureau, Ă  trois colonnes surmontĂ©es de petites icĂŽnes : un groupe de personnes, une baie de serveurs, un calendrier. Un Ă©lĂ©phant Ă  lunettes de lecture Ă©crit dans la deuxiĂšme colonne. À cĂŽtĂ© du registre, une petite pile de piĂšces et un calendrier mural avec un mois entourĂ©

Le calendrier

L’historique des mises Ă  niveau de Wikimedia est public : la production est passĂ©e de PHP 7.4 Ă  8.1 en mars 2025, Ă  8.3 en novembre 2025, et prĂ©voyait 8.5 pour fin 2026. Une version mineure sort chaque annĂ©e fin novembre ou dĂ©but dĂ©cembre et reste maintenue quatre ans, si bien que vous devez prĂ©voir une mise Ă  niveau par an pour rester en support actif, ou une tous les deux Ă  trois ans pour rester en support de sĂ©curitĂ©. Le travail d’une mise Ă  niveau est borné : le langage dĂ©prĂ©cie dans une version mineure et supprime Ă  la majeure suivante, les analyseurs signalent les dĂ©prĂ©ciations, et Rector applique les réécritures mĂ©caniques. Sur une base de code bien testĂ©e, une montĂ©e de version se compte en jours ; sur une base non testĂ©e, en semaines.

Le parc installĂ© montre ce qui arrive quand ce budget n’est pas payĂ©.

Versions de PHP en usage, trois populations Trois barres empilées. Installations Composer sur Packagist, août 2026 : PHP 8 94,2 pour cent, PHP 7 5,6, PHP 5 0,2. Sites WordPress remontant à wordpress.org, septembre 2026 : PHP 8 77,2, PHP 7 20,8, PHP 5 2,1. Sites web sur W3Techs, septembre 2026 : PHP 8 64,1, PHP 7 28,1, PHP 5 7,9. Versions de PHP en usage, trois populations Installations Composer (Packagist) 94,2% Sites WordPress (wordpress.org) 77,2% 20,8% Sites web (W3Techs) 64,1% 28,1% PHP 8 PHP 7 PHP 5 Packagist php-statistics, août 2026 ; api.wordpress.org/stats/php, 17 septembre 2026 ; W3Techs, 17 septembre 2026. PHP 4 (0,1 % des sites) regroupé avec PHP 5.

Parmi les paquets installĂ©s via Composer, 94 % des installations d’aoĂ»t 2026 tournaient sur PHP 8 et 0,2 % sur PHP 5. Les sites WordPress qui se dĂ©clarent Ă  wordpress.org en Ă©taient Ă  77 % de PHP 8, 21 % de PHP 7 et 2 % de PHP 5. Le web tel que W3Techs le dĂ©tecte tournait Ă  64 % sur PHP 8, 28 % sur PHP 7 et 8 % sur PHP 5, et ces deux derniĂšres sont des versions qui n’ont reçu aucun correctif de sĂ©curitĂ© depuis novembre 2022 et dĂ©cembre 2018 respectivement. Ce sont trois populations : les dĂ©veloppeurs qui construisent, les sites qui se mettent Ă  jour eux-mĂȘmes, et le web tel qu’il est. L’écart entre la premiĂšre et la troisiĂšme, c’est la dette technique de l’écosystĂšme, et si vous hĂ©ritez d’une base de code PHP, demandez Ă  quelle population elle appartient avant d’annoncer un prix.

La limite : le recrutement PHP est bon marchĂ© selon les mĂ©dianes et son hĂ©bergement a le moins de piĂšces mobiles, et chacun de ces faits traĂźne son ombre, une question de rĂ©tention et un parc installĂ© dont plus d’un tiers tourne sur des versions non maintenues. BudgĂ©tez la mise Ă  niveau annuelle et recrutez le spĂ©cialiste plutĂŽt que l’utilisateur occasionnel, et vous obtenez le bon cĂŽtĂ© de chaque fait ; sautez l’un ou l’autre, et vous obtenez l’autre cĂŽtĂ©.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Cherchez le langage sur les sites d’offres d’emploi de votre ville, puis les frameworks que vous utiliseriez, et comparez le nombre d’annonces et la fourchette affichĂ©e avec les langages que vous envisagez : cela vaut mieux que n’importe quelle mĂ©diane mondiale. Demandez Ă  votre hĂ©bergeur ou Ă  votre Ă©quipe plateforme quelle version de PHP ils font tourner aujourd’hui, et comment ils la mettraient Ă  niveau. Prenez ensuite un projet PHP open source de la taille de votre base de code, en retard de deux versions, et passez-y le jeu de rĂšgles de mise Ă  niveau de Rector : le diff qu’il produit, c’est le coĂ»t d’une version, sous vos yeux.

Les cas oĂč cette arithmĂ©tique cesse de s’appliquer, parce que PHP est le mauvais outil et non un outil cher, sont rassemblĂ©s dans LĂ  oĂč PHP est le mauvais choix.

LĂ  oĂč PHP est le mauvais choix

Une Ă©valuation incapable de nommer les cas oĂč son sujet perd n’est pas une Ă©valuation, et PHP perd dans plusieurs. PHP est le mauvais choix pour le calcul limitĂ© par le CPU, pour les services dont le mĂ©tier est de maintenir de nombreuses connexions de longue durĂ©e, pour tout ce qui s’exĂ©cute hors d’un serveur, et pour les Ă©quipes dont les compĂ©tences, la plateforme et l’échelle les ont dĂ©jĂ  menĂ©es ailleurs. Dans chacun de ces cas, le conseil honnĂȘte est rarement « tout réécrire » et bien plus souvent « pas cette partie », avec un autre outil pour la partie en question.

Le calcul

Le programme n-body prend 204 secondes en PHP avec le JIT dĂ©sactivĂ©, contre 8,6 pour Node.js, et le JIT resserre cet Ă©cart sans le combler, comme DĂ©bit et latence l’a montrĂ©. Sur du code qui occupe un cƓur, l’interprĂ©teur joue dans la catĂ©gorie de Python et de Ruby, un ordre de grandeur derriĂšre V8, la JVM, .NET, Go et Rust. Autour de lui, aucune pile numĂ©rique digne de ce nom : pas de bibliothĂšque de tableaux de la portĂ©e de NumPy, pas de bibliothĂšque de dataframes de la portĂ©e de pandas, pas de framework d’apprentissage automatique qu’une Ă©quipe de recherche reconnaĂźtrait. Les paquets qui existent sont rares et maintenus par de petits groupes, et je n’ai trouvĂ© aucun chiffre d’échelle Ă  citer pour aucun d’entre eux.

Si votre produit est un modĂšle, une simulation, un pipeline de traitement du signal ou un gros calcul par lots, prenez Python pour l’écosystĂšme ou un langage compilĂ© pour la vitesse. Si ce produit a aussi une façade web, c’est lĂ  que PHP peut encore trouver sa place.

Les connexions de longue durée

Dix mille connexions inactives coĂ»tent dix mille processus dans le modĂšle par dĂ©faut de PHP, et un processus coĂ»te trop cher pour le dĂ©penser sur une socket qui dort. Les runtimes asynchrones de Concurrence existent et tiennent la charge, l’entrĂ©e Swoole servant 3,5 millions de requĂȘtes pipelinĂ©es par seconde sur le test plaintext. Mais ce sont des bibliothĂšques avec leurs propres clients d’entrĂ©es-sorties, pas une propriĂ©tĂ© du langage, et la plupart des paquets de l’écosystĂšme ont Ă©tĂ© Ă©crits pour le modĂšle bloquant. Un backend de chat, un serveur de jeu multijoueur, une passerelle de trading, un pipeline de streaming ou un service de notifications push, c’est le cas ordinaire pour Node.js, Go, Elixir et Erlang, Java ou C#, et ces Ă©cosystĂšmes ont les bibliothĂšques qui vont avec.

Les budgets de latence sous la milliseconde tombent du mĂȘme cĂŽtĂ©. Le plancher d’une requĂȘte PHP-FPM est sous la milliseconde sur une machine au repos, et rien de ce qui se construit dessus n’y reste sous charge, donc un systĂšme avec ce budget s’écrit dans un langage compilĂ©.

Hors du serveur

PHP est un langage pour serveurs. Il a un interprĂ©teur en ligne de commande, et une bonne partie de l’outillage est Ă©crite avec, mais pour les applications de bureau, les applications mobiles, les navigateurs, les appareils embarquĂ©s ou la distribution d’un binaire autonome aux utilisateurs finaux, il n’a rien sur quoi une Ă©quipe devrait bĂątir. Si vos utilisateurs n’exĂ©cutent pas d’interprĂ©teur PHP, Ă©crivez l’outil que vous leur donnez dans autre chose.

Un mur d'atelier oĂč les outils sont suspendus dans leurs silhouettes. Un Ă©lĂ©phant se tient devant, remettant une clĂ© Ă  molette dans sa silhouette et tendant la main vers un autre outil. Sur l'Ă©tabli en dessous, un objet Ă  moitiĂ© terminĂ© qui a manifestement besoin du second outil

Les garanties au niveau du langage

Un match auquel il manque une branche lĂšve une exception Ă  l’exĂ©cution. Ce seul fait dĂ©crit le systĂšme de types du chapitre Le langage en 2026 : il est appliquĂ© Ă  l’exĂ©cution, aux frontiĂšres des fonctions et des propriĂ©tĂ©s, sans gĂ©nĂ©riques dans le langage, sans Ă©tape de compilation, sans modĂšle de propriĂ©tĂ© ni de durĂ©e de vie, et sans vĂ©rification d’exhaustivitĂ©. La rĂ©ponse de l’écosystĂšme est un analyseur statique lancĂ© Ă  son niveau le plus strict Ă  chaque build, ce qui donne Ă  un projet typĂ© l’essentiel de ce qu’un compilateur donnerait, et beaucoup de grandes bases de code PHP vivent avec cette rĂ©ponse. Si « le compilateur le garantit » est pour vous une exigence et non une prĂ©fĂ©rence, Ă  cause du domaine, du rĂ©gulateur ou de la taille de la base de code, TypeScript, Java, C#, Kotlin, Go ou Rust vous serviront mieux, et je ne plaiderai pas le contraire.

Les Ă©quipes et l’échelle

Un dĂ©veloppeur professionnel sur cinq a Ă©crit du PHP l’an dernier, un sur onze le cite comme langage principal, et sa part du web est passĂ©e de 80 Ă  70 % en dix ans. La part des dĂ©veloppeurs est plus petite que la part des serveurs en production. Empreinte documente aussi les entreprises qui ont quittĂ© PHP, et elles sont parties vers Java, Go ou TypeScript quand un monolithe web s’était muĂ© en un ensemble de services : Zalando en 2010, Trivago en 2021, Dailymotion et BlaBlaCar en 2025 et 2026. Leurs documents publics donnent l’architecture pour raison, pas le coĂ»t du runtime.

Si vos ingĂ©nieurs travaillent dĂ©jĂ  dans un autre langage, sur une plateforme construite pour lui, ajouter PHP pour un nouveau service vous rapporte peu. Les avantages du runtime, dĂ©crits tout au long de ce livre, sont des avantages de simplicitĂ©, et une seconde pile les efface. Et si votre entreprise a atteint l’échelle oĂč elle réécrit son monolithe en services compilĂ©s et typĂ©s, vous suivez un schĂ©ma dans lequel PHP est ce que l’on quitte, comme Ruby et Python le sont ailleurs au mĂȘme stade.

LĂ  oĂč le doute ne s’applique pas

Les mĂȘmes preuves soutiennent le verdict inverse, et sans adjectifs. Les applications web en requĂȘte-rĂ©ponse, Ă  toute Ă©chelle que vous avez des chances d’atteindre : contenu, commerce, back-offices, API, les plateformes du chapitre Empreinte et les applications sur mesure bĂąties Ă  cĂŽtĂ©. Les Ă©quipes qui tiennent Ă  un runtime sans processus Ă  materner et Ă  un dĂ©ploiement qui se rĂ©sume Ă  une copie de fichiers. Les organisations qui doivent faire tourner un logiciel pendant dix ans sur un hĂ©bergement qu’elles ne contrĂŽlent pas, oĂč le parc installĂ© et la fenĂȘtre de support de quatre ans pĂšsent plus que le dĂ©bit. Et les produits dont la partie difficile est le domaine et non la machine, c’est-Ă -dire la plupart des produits.

La limite de ce chapitre : il nomme les cas que les preuves couvrent. Un domaine que je n’ai pas mesurĂ©, je ne l’ai pas jugĂ©, et si le vĂŽtre en fait partie, dĂ©roulez la semaine qui suit avant de croire la rĂ©putation, ou moi.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Écrivez la charge de travail de votre produit qui vous inquiĂšte le plus, et cherchez-la ci-dessus. Si elle y est, le conseil tient, sauf si votre propre mesure le contredit. Si elle n’y est pas, Une Ă©valuation en une semaine existe pour elle.

Une évaluation en une semaine

Rien de ce que j’ai Ă©crit ne devrait dĂ©cider Ă  votre place. La raison de votre dĂ©cision devrait ĂȘtre une mesure faite sur votre propre charge de travail, et il ne faut pas longtemps pour en faire une. Cinq jours ouvrĂ©s suffisent pour installer le langage, le lire, l’exĂ©cuter sous charge, construire une tranche de votre produit, et vĂ©rifier par vous-mĂȘme l’écosystĂšme et la gouvernance. Il vous faut un ordinateur portable, une petite machine virtuelle et personne d’autre, et ce que vous tenez Ă  la fin, c’est une page de chiffres que personne ne vous a tendue.

Jour un : le langage

Installez PHP 8.5 depuis votre gestionnaire de paquets ou lancez l’image officielle, php:8.5-cli. Collez le premier exemple du chapitre Le langage en 2026 dans un fichier, exĂ©cutez-le, puis cassez-le comme ce chapitre le suggĂšre et lisez chaque message d’erreur. Clonez un projet PHP open source d’une taille qui vous parle et lancez sa suite de tests. Passez ensuite un analyseur statique, PHPStan ou Psalm, Ă  son niveau le plus strict, et lisez les vingt premiers rĂ©sultats :

composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse --level=max src

composer require --dev vimeo/psalm
vendor/bin/psalm --init src 1 && vendor/bin/psalm

Ce que l’analyseur attrape et que le moteur laisse passer, c’est la rĂ©ponse pratique Ă  la question des gĂ©nĂ©riques. Notez le temps qu’il vous a fallu pour lire la base de code, et si les rĂ©sultats Ă©taient des choses que vous auriez voulu voir attrapĂ©es.

Jour deux : le runtime

Sur la machine virtuelle, installez PHP-FPM avec nginx, activez OPcache et servez un script hello-world. Servez ensuite le mĂȘme script sous FrankenPHP en mode worker, et chargez les deux avec le mĂȘme outil, Ă  la mĂȘme concurrence :

wrk -t4 -c64 -d30s --latency http://127.0.0.1/

Notez pour chaque exĂ©cution les requĂȘtes par seconde, la latence mĂ©diane, le 99e centile et la mĂ©moire par worker, lue sur la page de statut de FPM ou dans ps. Remplacez ensuite le hello-world par le squelette d’un framework full-stack, n’importe lequel parmi CakePHP, Laminas, Laravel, Symfony ou Yii, et recommencez. Le rapport entre les quatre exĂ©cutions est le coĂ»t du runtime pour votre future application sur votre matĂ©riel, le chiffre que DĂ©bit et latence ne pouvait vous donner que pour le matĂ©riel de quelqu’un d’autre.

Jour trois : une tranche du produit

Choisissez la fonctionnalitĂ© de votre produit qui le reprĂ©sente le mieux : un endpoint authentifiĂ© qui lit et Ă©crit une base de donnĂ©es, rend ou sĂ©rialise quelque chose, et envoie un message dans une file. Construisez-la dans le framework choisi le deuxiĂšme jour, avec des tests, en n’utilisant que ce que le framework et Packagist fournissent, et n’optimisez pas. Notez le temps que cela a pris, la part que vous avez Ă©crite et la part que vous avez configurĂ©e, le nombre de paquets tirĂ©s, et ce que composer audit en a dit.

Une bande de cinq cases identiques dessinées sur un mur comme un planning hebdomadaire. Un éléphant debout sur un petit tabouret coche la troisiÚme case avec un stylo ; les deux premiÚres portent une coche, les deux derniÚres sont vides. Un ordinateur portable et un petit serveur sont posés au sol sous la bande

Jour quatre : la tranche sous charge

Chargez la tranche du troisiĂšme jour comme vous avez chargĂ© le hello-world, Ă  la concurrence que vous attendez en production, puis Ă  dix fois cette valeur. Profilez une requĂȘte lente avec le profileur de Xdebug ou avec hrtime() autour des appels suspects, et regardez oĂč passe le temps ; sur la plupart des tranches, il passe dans la base de donnĂ©es, et le langage n’est qu’une mince part Ă  chaque bout. Notez le dĂ©bit et le 99e centile aux deux concurrences, et la part d’une requĂȘte passĂ©e hors de PHP.

Faites ensuite la seule chose que les benchmarks ne font jamais. Tuez un worker en pleine requĂȘte, saturez la limite de mĂ©moire, levez une exception non attrapĂ©e dans un job de file d’attente, et notez ce que l’utilisateur a vu, ce que les journaux ont dit, et ce qui s’est rĂ©tabli tout seul.

Jour cinq : l’écosystĂšme et la gouvernance

Cherchez sur Packagist les trois bibliothĂšques dont votre produit ne peut se passer, et notez pour chacune la date de sa derniĂšre version et son nombre de tickets ouverts. Ouvrez wiki.php.net/rfc et lisez la RFC en cours de vote, puis le fil internals qui la porte. Ouvrez la page des versions maintenues de php.net et notez la date Ă  laquelle la version que vous avez choisie cesse de recevoir des correctifs de sĂ©curitĂ©. Ouvrez la page Open Collective de la fondation et lisez le dernier mois de transactions, puis les trois avis de sĂ©curitĂ© les plus rĂ©cents de php-src, avec leur dĂ©lai entre signalement et correctif. Tout cela tient dans un aprĂšs-midi, et c’est la matiĂšre premiĂšre que Gouvernance et pĂ©rennitĂ© a rĂ©sumĂ©e pour vous.

La décision

La semaine a produit des chiffres, et une décision demande des pondérations que vous seul pouvez fixer. Chaque question ci-dessous a ses preuves publiques dans un chapitre et votre propre réponse dans un jour de la semaine.

QuestionPreuves publiquesVotre résultat de la semaine
Aurai-je envie de lire et d’écrire ce langage pendant des annĂ©es ?Le langage en 2026Jour un
Le débit du runtime suffit-il à mon trafic, sur mon matériel ?Débit et latenceJour deux, jour quatre
Ma charge de travail tient-elle dans le modĂšle par requĂȘte, ou maintient-elle des connexions, ou consomme-t-elle du CPU ?Le runtime, Concurrence, LĂ  oĂč PHP est le mauvais choixJour quatre
Les bibliothĂšques dont j’ai besoin existent-elles, et sont-elles maintenues ?L’écosystĂšmeJour trois, jour cinq
Qui maintient le langage, et jusqu’à quand ma version est-elle prise en charge ?Gouvernance et pĂ©rennitĂ©Jour cinq
Puis-je recruter pour lui, l’hĂ©berger, et me payer la mise Ă  niveau annuelle ?CoĂ»t de possessionVos sites d’offres d’emploi, votre Ă©quipe plateforme
Tourne-t-il, Ă  l’échelle, dans des organisations dont je croirais qu’elles ont vĂ©rifié ?EmpreinteLeurs documents publics

Certaines issues reviennent souvent. Quand la charge de travail est en requĂȘte-rĂ©ponse, que le dĂ©bit du deuxiĂšme jour a dĂ©passĂ© votre besoin avec de la marge et que les bibliothĂšques du cinquiĂšme jour Ă©taient vivantes, mes preuves et les vĂŽtres concordent, et la dĂ©cision porte sur votre Ă©quipe plus que sur le langage. Quand le quatriĂšme jour a rĂ©vĂ©lĂ© un cƓur limitĂ© par le CPU ou par les connexions, la conclusion honnĂȘte est un autre langage pour ce cƓur, avec Ă©ventuellement PHP autour. Et quand la semaine a Ă©tĂ© agrĂ©able mais que les sites d’offres d’emploi de votre ville Ă©taient vides, ou que les chiffres de rĂ©tention de CoĂ»t de possession vous inquiĂštent plus que le runtime, c’est une raison lĂ©gitime de dĂ©cliner. Je ne la contesterai pas, mĂȘme sous l’égide de la fondation du langage.

La limite : une semaine mesure une tranche, pas un produit, et l’équipe qui fait tourner la tranche n’est pas celle qui fera tourner le produit pendant dix ans. La semaine retire la rĂ©putation de la dĂ©cision, et laisse le jugement.

Ce que vous pouvez vĂ©rifier vous-mĂȘme

Tout ce qui prĂ©cĂšde. Si un chiffre de ces pages se rĂ©vĂšle faux quand vous le vĂ©rifiez, l’annexe des sources donne l’URL oĂč vit le bon, et le dĂ©pĂŽt derriĂšre ce livre accepte les corrections. C’est l’arrangement que vous devez attendre de tout document qui rĂ©clame votre temps.

Annexes

Trois sections de référence ferment ce livre, et chacune existe pour que vous puissiez vérifier plutÎt que croire.

A - Sources liste chaque chiffre utilisĂ© dans le livre, chapitre par chapitre, avec l’éditeur, l’URL, la date Ă  laquelle la donnĂ©e se rapporte et la date de sa derniĂšre vĂ©rification. Elle se termine par les chiffres que j’ai refusĂ©s, et pourquoi.

B - Les versions de PHP, 2015 Ă  2026 donne la date de sortie, la fenĂȘtre de support et les changements marquants de chaque version, de PHP 7.0 Ă  PHP 8.5, pour qu’un chiffre sur « PHP 8 » puisse ĂȘtre situĂ© dans le temps.

C - Glossaire dĂ©finit les termes que j’emploie et que vous pouvez ne pas connaĂźtre si vous venez d’un autre Ă©cosystĂšme.

A - Sources

Chaque chiffre utilisĂ© dans le livre, chapitre par chapitre, avec son Ă©diteur, la date Ă  laquelle la donnĂ©e se rapporte, et l’URL. « VĂ©rifié » est la date Ă  laquelle la page a Ă©tĂ© lue pour la derniĂšre fois pour cette Ă©dition. Quand une source est un fournisseur, une auto-dĂ©claration ou un benchmark synthĂ©tique, l’entrĂ©e le dit, comme le chapitre l’a fait. Quand un chapitre cite un document que le livre n’a pas pu lire directement, l’entrĂ©e le dit aussi.

Les graphiques sont générés à partir des fichiers de données de charts/data/, dont chacun répÚte sa source, et les tables brutes TechEmpower utilisées par les chapitres 3 et 4 sont stockées en CSV dans charts/raw/.

Comment lire ce livre

  • Historique des versions de PHP et fonctionnalitĂ©s citĂ©es : pages de versions et changelogs de php.net, vĂ©rifiĂ©s le 17 septembre 2026. https://www.php.net/releases/
  • La PHP Foundation salariant des dĂ©veloppeurs du cƓur depuis 2021 : annonce JetBrains, 22 novembre 2021. https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/

Empreinte

  • Part des sites web par langage cĂŽtĂ© serveur (PHP 69,9 %, JavaScript 7,5, Ruby 7,1, Java 5,4, Scala 5,0, ASP.NET 4,2, Python 1,1) : W3Techs, donnĂ©es du 17 septembre 2026. https://w3techs.com/technologies/overview/programming_language
  • Part historique par annĂ©e, valeurs au 1er janvier (PHP 80,6 % en 2015, 75,2 en 2025, 72,4 en 2026) : tendances historiques W3Techs, vĂ©rifiĂ©es le 17 septembre 2026. https://w3techs.com/technologies/history_overview/programming_language/ms/y
  • JavaScript dĂ©passant Ruby comme deuxiĂšme langage cĂŽtĂ© serveur : W3Techs « technology fact of the day », 27 juillet 2026. https://w3techs.com/
  • MĂ©thodologie W3Techs (Ă©chantillon de plus de 20 millions de sites, un site par domaine, domaines redirigĂ©s exclus, mises Ă  jour quotidiennes) : vĂ©rifiĂ©e le 17 septembre 2026. https://w3techs.com/technologies
  • WordPress 40,2 % de tous les sites web et 58,8 % du marchĂ© des CMS ; Joomla 1,1, Drupal 0,6, PrestaShop 0,5, TYPO3 0,3 ; 31,5 % des sites sans CMS dĂ©tecté : W3Techs, 17 septembre 2026. https://w3techs.com/technologies/overview/content_management
  • WooCommerce 8,0 % de tous les sites web, 47,7 % des systĂšmes d’e-commerce : W3Techs, 17 septembre 2026. https://w3techs.com/technologies/details/cm-woocommerce
  • Moodle 146 634 sites enregistrĂ©s et 531 millions d’utilisateurs (sites auto-enregistrĂ©s seulement) : stats.moodle.org, vĂ©rifiĂ© le 17 septembre 2026. https://stats.moodle.org/
  • Nextcloud « 500K+ servers » : Nextcloud, bilan 2025, 11 dĂ©cembre 2025. https://nextcloud.com/blog/nextcloud-2025-wrap-up/
  • Drupal 470 795 sites dĂ©clarant leur version : statistiques d’usage de drupal.org, semaine du 6 septembre 2026. https://www.drupal.org/project/usage/drupal
  • PrestaShop prĂšs de 250 000 sites et plus de 22 milliards d’euros de ventes en 2024 (auto-dĂ©clarĂ©) : prestashop.com, vĂ©rifiĂ© le 17 septembre 2026. https://prestashop.com/about-us/
  • Shopware sur 115 des 1 000 plus grandes boutiques B2C allemandes (Ă©tude EHI 2025) : Shopware, 10 janvier 2025. https://www.shopware.com/en/news/shopware-is-the-market-leader-among-ecommerce-platforms-in-germany/
  • Matomo « more than 1.4 million websites » : Matomo, 1er septembre 2026. https://matomo.org/blog/2026/09/matomo-launches-reseller-partner-programme/
  • Wikimedia 19,4 milliards de pages vues par mois : Ă©tats financiers auditĂ©s de la Wikimedia Foundation, exercice 2023 Ă  2024. https://upload.wikimedia.org/wikipedia/foundation/f/f6/Wikimedia_Foundation_2024_Audited_Financial_Statements.pdf
  • Production Wikimedia sur PHP 8.3 depuis le 25 novembre 2025 : Phabricator T360995, rĂ©solu le 18 dĂ©cembre 2025. https://phabricator.wikimedia.org/T360995
  • Migration Wikimedia vers PHP 8.5 prĂ©vue pour fin 2026 : Phabricator T413223, créé le 19 dĂ©cembre 2025. https://phabricator.wikimedia.org/T413223
  • Fin de HHVM en production chez Wikimedia : Phabricator T176370, rĂ©solu le 23 novembre 2019. https://phabricator.wikimedia.org/T176370
  • Wikimedia 800 000 requĂȘtes par seconde en bordure et sept centres de donnĂ©es : Wikimedia Foundation, 26 novembre 2025. https://wikimediafoundation.org/news/2025/11/26/how-does-the-wikimedia-foundation-use-donations-to-wikipedia/
  • Automattic : Tumblr et WordPress « run on PHP primarily » : automattic.com, vĂ©rifiĂ© le 17 septembre 2026. https://automattic.com/work-with-us/tumblr-migration/
  • WordPress VIP 2 400 milliards de requĂȘtes par an et 22 milliards la nuit de l’élection de 2024 (page marketing, CDN inclus) : wpvip.com, vĂ©rifiĂ© le 17 septembre 2026. https://wpvip.com/capabilities/performance/
  • Les ingĂ©nieurs d’Etsy « primarily code in PHP and JavaScript » : careers.etsy.com, vĂ©rifiĂ© le 17 septembre 2026. https://careers.etsy.com/engineering
  • Etsy sur PHP 7 en 2016 : confĂ©rence « Deploying PHP 7 », PHP Conference Philippines, 13 octobre 2016. https://talks.php.net/ph16
  • ExĂ©cuteur de jobs et monolithe PHP de Mailchimp : blog dĂ©veloppeurs de Mailchimp, « Computers are the easy part », non datĂ©, vĂ©rifiĂ© le 17 septembre 2026. https://mailchimp.com/developer/blog/computers-are-the-easy-part/ Les offres d’emploi sur jobs.intuit.com demandant PHP, 2025 Ă  2026, ont Ă©tĂ© lues mais expirent et n’ont pas pu ĂȘtre archivĂ©es ; le chapitre s’appuie sur le billet de blog.
  • Badoo trois millions de lignes de PHP, des centaines de serveurs, un million de dollars Ă©conomisĂ©s : Bumble Tech, 7 fĂ©vrier 2017. https://medium.com/bumble-tech/how-badoo-saved-one-million-dollars-switching-to-php7-fcbda94ad3ae
  • Sites web de la Commission europĂ©enne sur Drupal : les mĂ©tadonnĂ©es generator de commission.europa.eu dĂ©clarent Drupal 11, vĂ©rifiĂ© le 17 septembre 2026. Le chiffre de 770 sites en ligne vient d’une prĂ©sentation du personnel de la Commission Ă  Drupal4Gov EU, 29 janvier 2026, telle que rapportĂ©e par des participants ; les diapositives n’ont pas Ă©tĂ© trouvĂ©es en ligne et le chiffre n’est pas confirmĂ© par une publication de la Commission. https://drunomics.com/en/blog/drupal4gov-eu-2026-how-drupal-powers-european-governments-247
  • Maison-Blanche sur WordPress VIP avec autorisation FedRAMP Moderate : wpvip.com, mars 2025. https://wpvip.com/blog/fedramp-moderate/
  • Le Government Site Builder allemand sur TYPO3, plus de 80 administrations et 250 sites : ITZBund et typo3.com, vĂ©rifiĂ©s le 17 septembre 2026. https://www.itzbund.de/DE/itloesungen/standardloesungen/gsb/gsb.html
  • GovCMS plus de 370 sites pour 115 agences : govcms.gov.au, 2025, tel que citĂ© par The PHP Foundation, 2 septembre 2026. https://thephp.foundation/blog/2026/09/02/digital-sovereignty-is-written-in-php/
  • LocalGov Drupal 77 sites de collectivitĂ©s : localgovdrupal.org, vĂ©rifiĂ© le 17 septembre 2026. https://localgovdrupal.org/
  • HHVM mettant fin Ă  la prise en charge de PHP : hhvm.com, 12 septembre 2018 et 11 fĂ©vrier 2019. https://hhvm.com/blog/2018/09/12/end-of-php-support-future-of-hack.html et https://hhvm.com/blog/2019/02/11/hhvm-4.0.0.html
  • Slack sur Hack, environ cinq millions de lignes : Slack Engineering, 14 avril 2020 et 8 fĂ©vrier 2023. https://slack.engineering/hacklang-at-slack-a-better-php/ et https://slack.engineering/hakana-taking-hack-seriously/
  • Réécriture de Zalando en Java en 2010 : tĂ©moignage d’un ancien ingĂ©nieur de Zalando, 3 mars 2020. https://srcco.de/posts/one-decade-in-zalando-tech.html
  • Passage de Trivago de PHP Ă  TypeScript : blog technique de trivago, 16 mai 2022. https://tech.trivago.com/post/2022-05-16-warp-a-web-application-rewrite-project
  • Dailymotion « gradually reducing PHP », nouveaux dĂ©veloppements en Go, Java et Python : offre d’emploi « Senior Backend Software Engineer, Video Platform », lue le 17 septembre 2026 (les offres expirent). https://jobs.smartrecruiters.com/Dailymotion/744000136260231-senior-backend-software-engineer-video-platform-full-remote-from-france- Usage historique : blog Symfony, 18 fĂ©vrier 2011.
  • Migration de BlaBlaCar « from a PHP/Symfony stack towards a Java/JS-dominated one » : offre d’emploi « Software Engineer, Backend », lue le 17 septembre 2026 (les offres expirent). https://jobs.smartrecruiters.com/BlaBlaCar/743999670001836-software-engineer-backend Usage historique : SymfonyCon Paris, 4 dĂ©cembre 2015.
  • Chiffres de l’enquĂȘte dĂ©veloppeurs (PHP 19,1 % des dĂ©veloppeurs professionnels, 12e) : Stack Overflow Developer Survey 2025, menĂ©e de mai Ă  juin 2025, 49 009 rĂ©ponses. https://survey.stackoverflow.co/2025/technology
  • JetBrains 17 % d’utilisateurs (13e langage), 9 % en langage principal (9e), « long-term decline » : JetBrains State of Developer Ecosystem 2025, 24 534 rĂ©pondants, menĂ©e d’avril Ă  juin 2025. https://devecosystem-2025.jetbrains.com/
  • 58 % des dĂ©veloppeurs PHP ne prĂ©voyant pas de migrer : JetBrains, The State of PHP 2025, octobre 2025, 1 720 rĂ©pondants. https://blog.jetbrains.com/phpstorm/2025/10/state-of-php-2025/
  • PHP sixiĂšme langage par contributeurs mensuels : GitHub Octoverse 2025, 28 octobre 2025. https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/
  • PHP quatriĂšme, Ă  Ă©galitĂ© avec C# : classement des langages RedMonk, janvier 2026, publiĂ© le 14 avril 2026. https://redmonk.com/sogrady/2026/04/14/language-rankings-1-26/
  • PHP 14e Ă  1,04 % : index TIOBE, septembre 2026. https://www.tiobe.com/tiobe-index/

Le runtime

  • ModĂšle de processus et configuration de PHP-FPM : manuel php.net, vĂ©rifiĂ© le 17 septembre 2026. https://www.php.net/manual/en/install.fpm.php
  • OPcache : manuel php.net, vĂ©rifiĂ© le 17 septembre 2026. https://www.php.net/manual/en/book.opcache.php
  • Chiffres du prĂ©chargement (30 % et 50 % sur deux pages hello-world de frameworks, « will likely be lower ») : RFC Preloading, wiki.php.net, 2018, acceptĂ©e 48 voix contre 0. https://wiki.php.net/rfc/preload
  • JIT : « about 3 times better performance on synthetic benchmarks », « typical application performance is on par with PHP 7.4 » : php.net, annonce de la version PHP 8.0. https://www.php.net/releases/8.0/en.php
  • JIT sur WordPress, 326 contre 315 requĂȘtes par seconde : RFC JIT, wiki.php.net, 2019. https://wiki.php.net/rfc/jit
  • JIT dĂ©sactivĂ© par dĂ©faut depuis PHP 8.4 : php.net, configuration d’OPcache, opcache.jit. https://www.php.net/manual/en/opcache.configuration.php
  • FrankenPHP sous l’organisation php depuis le 8 juin 2025 : The PHP Foundation, 15 mai et 8 juin 2025. https://thephp.foundation/blog/2025/05/15/frankenphp/ et https://thephp.foundation/blog/2025/06/08/php-30/
  • Mode worker de FrankenPHP, « not originally designed for long-running processes », rĂ©glage du nombre maximal de requĂȘtes : documentation frankenphp.dev, vĂ©rifiĂ©e le 17 septembre 2026. https://frankenphp.dev/docs/worker/
  • RoadRunner : roadrunner.dev, vĂ©rifiĂ© le 17 septembre 2026. https://roadrunner.dev/
  • Swoole et OpenSwoole : openswoole.com et github.com/swoole/swoole-src, vĂ©rifiĂ©s le 17 septembre 2026.
  • FrankenPHP en mode classique contre PHP-FPM, 18 403 contre 18 478 requĂȘtes par seconde, p99 0,9 ms, machine virtuelle Ă  huit vCPU : Tideways, 23 septembre 2025 (indĂ©pendant des deux projets). https://tideways.com/profiler/blog/testing-if-franken-php-classic-mode-is-faster-and-more-scalable-than-php-fpm
  • Symfony sous PHP-FPM, FrankenPHP et Swoole sur le test Fortunes : TechEmpower Round 23, voir la section suivante.
  • CoĂ»t d’un processus nu (2 Mo de tas, 33 Mo rĂ©sidents, 20 ms) : mesurĂ© par l’auteur sur PHP 8.3.33 sous Linux, le 17 septembre 2026, avec memory_get_usage(true) et /usr/bin/time -v. Reproductible avec php -r ''.
  • Configuration des conteneurs Wikimedia (8 workers, 500 Mo d’OPcache, 768 Mo d’APCu, 1 Ă  2 Go par conteneur) : Phabricator T280497, 2021. https://phabricator.wikimedia.org/T280497

Débit et latence

  • « Execution time is often halved » : Zend (Rogue Wave), livre blanc « Maximize performance and mitigate risks with PHP 7 », 9 novembre 2017 ; un document de fournisseur sans mĂ©thodologie publiĂ©e. https://www.zend.com/sites/default/files/pdfs/rw-maximize-performance-mitigate-risks-wp-fnl-20171109.pdf
  • Scores PHPBench de PHP 5.6.40 Ă  8.0-dev (288 326 Ă  876 420) : OpenBenchmarking.org, rĂ©sultat 2002269-VE-PHPBENCHM24 par Michael Larabel, fĂ©vrier 2020, Core i9-9900KS, Ubuntu 20.04. https://openbenchmarking.org/result/2002269-VE-PHPBENCHM24
  • WordPress 146,09 requĂȘtes par seconde sur PHP 8.2 et 148,30 sur PHP 8.5, « incremental releases rarely produce large speed jumps » : Kinsta, 13 dĂ©cembre 2025 ; le benchmark d’un hĂ©bergeur, ApacheBench Ă  15 requĂȘtes concurrentes sur une machine Ă  30 vCPU, JIT dĂ©sactivĂ©. https://kinsta.com/blog/php-benchmarks/
  • TechEmpower Round 23 : rĂ©sultats datĂ©s du 24 fĂ©vrier 2025, matĂ©riel dĂ©crit par TechEmpower comme « ProLiant DL360 Gen10 Plus, Intel Xeon Gold 6330 (56 cores), 64 GB, 40 Gbps Ethernet » ; le Xeon Gold 6330 a 28 cƓurs et 56 threads. Page de rĂ©sultats (rendue en JavaScript), lue avec un navigateur headless le 17 septembre 2026, et stockĂ©e en CSV dans charts/raw/. https://www.techempower.com/benchmarks/#hw=ph&test=fortune&section=data-r23 Annonce du round : https://www.techempower.com/blog/2025/03/17/framework-benchmarks-round-23/
  • DĂ©pĂŽt TechEmpower archivé : github.com/TechEmpower/FrameworkBenchmarks, archivĂ©, dernier push le 24 mars 2026, lu via l’API GitHub le 17 septembre 2026.
  • Objectifs de latence de Wikimedia (50 ms en mĂ©diane, 200 ms en p99 pour GET, 500 ms en p99 pour POST) : Wikimedia, « Backend performance practices », derniĂšre modification le 27 juin 2026. https://wikitech.wikimedia.org/wiki/MediaWiki_Engineering/Guides/Backend_performance_practices
  • Tableau de bord public de latence de Wikimedia : Grafana, « Backend Pageview Timing » ; la mĂ©diane d’environ 170 millisecondes citĂ©e dans le chapitre y a Ă©tĂ© lue le 17 septembre 2026 vers 10 h 25 UTC, sur une heure, pour les requĂȘtes atteignant les serveurs d’application. https://grafana.wikimedia.org/d/QLtC93rMz/backend-pageview-timing
  • Temps Ă©coulĂ©s sur n-body, entrĂ©e mono-thread la plus rapide par langage (Rust 2,19 s, C# 3,13 s avec AOT natif, Java 6,02 s avec native image, Go 6,39 s, Node.js 8,55 s, Ruby 166,67 s, PHP 204,10 s, Python 360 s), spectral-norm (PHP 18,29 s Ă©coulĂ©es pour 72,34 s de CPU ; Python 90,37 s ; Ruby 56,52 s ; Node.js 1,60 s) : The Computer Language Benchmarks Game, vĂ©rifiĂ© le 17 septembre 2026. https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/nbody.html et https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html
  • Ligne de commande PHP utilisĂ©e par le Benchmarks Game (PHP 8.4.1, opcache.jit_buffer_size=64M, aucun rĂ©glage opcache.jit) : page du programme n-body PHP #3. https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-php-3.html
  • Gain d’un facteur quatre du JIT sur Mandelbrot : RFC JIT, wiki.php.net, 2019. https://wiki.php.net/rfc/jit

Concurrence

  • Fibers : « all fibers exist within a single thread », « blocking code 
 will continue to block the entire process » : RFC Fibers, wiki.php.net, acceptĂ©e 50 voix contre 14, mars 2021. https://wiki.php.net/rfc/fibers
  • AMPHP, ReactPHP : amphp.org et reactphp.org, vĂ©rifiĂ©s le 17 septembre 2026.
  • Chiffres du test plaintext de TechEmpower Round 23 : voir la section prĂ©cĂ©dente ; table brute dans charts/raw/techempower-r23-plaintext.csv.
  • RFC « Concurrency Support in the PHP Engine » en discussion : index des RFC de wiki.php.net, vĂ©rifiĂ© le 17 septembre 2026. https://wiki.php.net/rfc La RFC antĂ©rieure « PHP True Async » affiche le statut Canceled, derniĂšre modification le 22 juillet 2026. https://wiki.php.net/rfc/true_async

Le langage en 2026

  • Chaque fonctionnalitĂ© et sa version : pages de versions de php.net et la fiche de faits du guide d’écriture du livre polyglotte, tous deux vĂ©rifiĂ©s contre php.net. Les exemples ont Ă©tĂ© exĂ©cutĂ©s sous PHP 8.5 avec l’image Docker officielle le 17 septembre 2026.

L’écosystĂšme

  • Packagist 468 099 paquets, 5,8 millions de versions, 199,6 milliards d’installations depuis 2012 ; sĂ©rie mensuelle d’installations (2,0 milliards en 2016 Ă  36,0 milliards en 2025 ; 2,58 milliards en aoĂ»t 2025 et 4,93 milliards en aoĂ»t 2026) : packagist.org/statistics, lu le 17 septembre 2026. https://packagist.org/statistics
  • composer audit introduit dans Composer 2.4.0, 16 aoĂ»t 2022 : changelog de getcomposer.org. https://getcomposer.org/changelog/2.4.0 Documentation : https://getcomposer.org/doc/03-cli.md#audit
  • 1 649 avis dans la base partagĂ©e : github.com/FriendsOfPHP/security-advisories, comptĂ©s le 17 septembre 2026.
  • PIE 1.5, financĂ© par la Sovereign Tech Agency : The PHP Foundation, rapport trimestriel T2 2026, 21 juillet 2026. https://thephp.foundation/blog/2026/07/21/quarterly-report-q2-2026/
  • Projets construits sur les composants Symfony (auto-dĂ©clarĂ©s) : symfony.com/projects, vĂ©rifiĂ© le 17 septembre 2026. https://symfony.com/projects
  • Laravel 64 %, WordPress 25 %, Symfony 23 % parmi les dĂ©veloppeurs PHP ; PHPUnit 50, PHPStan 36, PHP-CS-Fixer 30, Pest 17, 32 % n’écrivant aucun test, 42 % n’utilisant aucun outil de qualité : JetBrains, The State of PHP 2025, octobre 2025. https://blog.jetbrains.com/phpstorm/2025/10/state-of-php-2025/
  • 14 PSR acceptĂ©es, PER Coding Style 3.1 : php-fig.org, vĂ©rifiĂ© le 17 septembre 2026. https://www.php-fig.org/psr/ et https://www.php-fig.org/per/coding-style/
  • Tags de version signĂ©s depuis avril 2012 : page des clĂ©s GPG de php.net. https://www.php.net/gpg-keys.php

Gouvernance et pérennité

  • Processus RFC et vote (majoritĂ© des deux tiers, deux semaines de discussion, deux semaines de vote, qui vote) : wiki.php.net, « How to create an RFC » et « Voting ». https://wiki.php.net/rfc/howto et https://wiki.php.net/rfc/voting
  • RFC refusĂ©es : Nullable Intersection Types (12 contre 26, aoĂ»t 2021) https://wiki.php.net/rfc/nullable_intersection_types ; Short Closures 2.0 (27 contre 16, refusĂ©e, juillet 2022) https://wiki.php.net/rfc/auto-capture-closure ; Asymmetric Visibility v1 (14 contre 12, janvier 2023) https://wiki.php.net/rfc/asymmetric-visibility et v2 (24 contre 7, aoĂ»t 2024) https://wiki.php.net/rfc/asymmetric-visibility-v2 ; Nested Classes (2 contre 20, mai 2025) https://wiki.php.net/rfc/short-and-inner-classes
  • Nombre de RFC par version (31 pour 8.4, 19 pour 8.5, 29 pour 8.6 en septembre 2026) : index des RFC de php.watch, une source secondaire. https://php.watch/rfcs
  • Dates de sortie de chaque version : archive des versions et changelogs de php.net, vĂ©rifiĂ©s le 17 septembre 2026. https://www.php.net/releases/ et https://www.php.net/ChangeLog-8.php
  • Politique de support et fenĂȘtres en cours : php.net, pages des versions maintenues et de fin de vie, vĂ©rifiĂ©es le 17 septembre 2026. https://www.php.net/supported-versions.php et https://www.php.net/eol.php
  • Mise Ă  jour du cycle de publication (support de sĂ©curitĂ© prolongĂ©, fenĂȘtres alignĂ©es sur le 31 dĂ©cembre ; votes 31 contre 0 et 33 contre 0) : RFC, wiki.php.net, acceptĂ©e en avril 2024. https://wiki.php.net/rfc/release_cycle_update
  • Calendrier de PHP 8.6 (GA le 19 novembre 2026, gel des fonctionnalitĂ©s le 22 septembre 2026) : wiki.php.net, calendrier de publication de PHP 8.6. https://wiki.php.net/todo/php86
  • ActivitĂ© de php-src (5 316 commits et 171 auteurs sur master dans les douze mois prĂ©cĂ©dant le 17 septembre 2026 ; 1 644 contributeurs) : mesurĂ©e sur un clone de github.com/php/php-src avec git log, et l’API des contributeurs de GitHub, 17 septembre 2026.
  • Fondation de The PHP Foundation (22 novembre 2021, dix membres fondateurs, le dĂ©part qui l’a dĂ©clenchĂ©e) : JetBrains, 22 novembre 2021, et thephp.foundation. https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/ et https://thephp.foundation/
  • Rapports de transparence : 2022 (22 novembre 2022) https://thephp.foundation/blog/2022/11/22/transparency-and-impact-report-2022/ ; 2023 (26 fĂ©vrier 2024) https://thephp.foundation/blog/2024/02/26/transparency-and-impact-report-2023/ ; 2024 (31 mars 2025) https://thephp.foundation/blog/2025/03/31/transparency-and-impact-report-2024/ ; 2025 (27 mai 2026) https://thephp.foundation/blog/2026/05/27/impact-and-transparency-report-2025/
  • Structure (treize ingĂ©nieurs, directeur exĂ©cutif, conseil de dix membres) : thephp.foundation/structure, vĂ©rifiĂ© le 17 septembre 2026. https://thephp.foundation/structure/
  • Contributions cumulĂ©es par sponsor (Automattic 762 500 dollars, JetBrains 476 670, total 3 368 941) : opencollective.com/phpfoundation, lu le 17 septembre 2026. https://opencollective.com/phpfoundation
  • Subventions de la Sovereign Tech Agency (205 000 euros en 2023 ; 223 680 euros en 2025) : sovereign.tech. https://www.sovereign.tech/tech/php et https://www.sovereign.tech/tech/php-2025
  • Subvention Alpha-Omega et Ecosystem Security Team : The PHP Foundation, 18 mai 2026. https://thephp.foundation/blog/2026/05/18/announcing-ecosystem-security-team/
  • Politique de sĂ©curitĂ© et classification : politique de sĂ©curitĂ© de github.com/php/php-src et github.com/php/policies. https://github.com/php/php-src/security/policy et https://github.com/php/policies/blob/main/security-classification.rst
  • RĂ©sultats de l’audit externe (27 problĂšmes, 17 avec des implications de sĂ©curitĂ©, 3 de gravitĂ© haute) : The PHP Foundation, 10 avril 2025. https://thephp.foundation/blog/2025/04/10/php-core-security-audit-results/
  • Nombre de CVE par annĂ©e de publication (8, 7, 18, 13, 14) : API NVD, produit cpe:2.3:a:php:php, interrogĂ©e le 17 septembre 2026. https://nvd.nist.gov/ Avis GitHub pour php-src : https://github.com/php/php-src/security/advisories

Coût de possession

  • Usage Stack Overflow 2025 (JavaScript 68,8 %, Python 54,8, TypeScript 48,8, C# 29,9, Java 29,6, PHP 19,1, Go 17,4, Rust 14,5, Ruby 6,9 parmi les dĂ©veloppeurs professionnels) et chiffres « admired » (Rust 72,4, TypeScript 58,0, Go 56,5, Python 56,4, C# 55,8, JavaScript 46,8, Ruby 44,3, Java 41,8, PHP 38,9) : Stack Overflow Developer Survey 2025. https://survey.stackoverflow.co/2025/technology
  • Salaire mĂ©dian par langage (PHP 49 586 dollars, deuxiĂšme plus bas sur cinquante) : Stack Overflow Developer Survey 2024, « Top paying technologies ». https://survey.stackoverflow.co/2024/technology#top-paying-technologies
  • 613 offres d’emploi permanentes au Royaume-Uni citant PHP sur les six mois prĂ©cĂ©dant le 17 septembre 2026, 404 un an plus tĂŽt, mĂ©diane 48 676 livres : IT Jobs Watch, un agrĂ©gateur britannique, secondaire. https://www.itjobswatch.co.uk/jobs/uk/php.do
  • Badoo un million de dollars Ă©conomisĂ©s : Bumble Tech, 7 fĂ©vrier 2017, comme dans Empreinte.
  • Cadence de mise Ă  niveau de Wikimedia : passage de PHP 7.4 Ă  8.1 annoncĂ© sur wikitech-l le 17 mars 2025 et achevĂ© le mĂȘme mois ; 8.1 Ă  8.3 achevĂ© le 25 novembre 2025 (Phabricator T360995) ; 8.5 prĂ©vu pour fin 2026 (Phabricator T413223).
  • Versions de PHP par population : Packagist php-statistics, aoĂ»t 2026 https://packagist.org/php-statistics ; API de statistiques de wordpress.org, lue le 17 septembre 2026 https://api.wordpress.org/stats/php/1.0/ ; versions de PHP selon W3Techs, 17 septembre 2026 https://w3techs.com/technologies/details/pl-php
  • Fin du support de sĂ©curitĂ© de PHP 7.4 (28 novembre 2022) et de PHP 5.6 (31 dĂ©cembre 2018) : page de fin de vie de php.net. https://www.php.net/eol.php

LĂ  oĂč PHP est le mauvais choix

  • Tous les chiffres sont repris des chapitres ci-dessus et portent les mĂȘmes sources.

Non utilisés, et pourquoi

Chiffres qui circulent sur PHP et que le livre a laissĂ©s de cĂŽtĂ© parce qu’aucune source primaire n’a pu ĂȘtre trouvĂ©e, ou parce que la source primaire les contredit :

  • « Spotify sert 600 000 requĂȘtes par seconde avec Symfony » : un chiffre de trafic global repris par des blogs d’agences ; la seule source primaire est une confĂ©rence de 2015 sur le site spotify.com.
  • « Etsy est repassĂ© de HHVM Ă  PHP 7 en 2019 ou 2020 » : Etsy Ă©tait sur PHP 7 en 2016 ; HHVM n’a jamais Ă©tĂ© utilisĂ© que sur son cluster d’API.
  • « Laravel est utilisĂ© par OpenAI, Apple, Nike, la NASA » : une affirmation sur laravel.com sans source par entreprise.
  • « Adobe Commerce a traitĂ© 6,2 milliards de dollars lors du Black Friday 2024 » : trouvĂ© seulement sur des agrĂ©gateurs tiers ; les propres communiquĂ©s d’Adobe donnent des chiffres pour l’ensemble de l’e-commerce amĂ©ricain mesurĂ© par Adobe Analytics.
  • « Mercedes-Benz sponsorise The PHP Foundation » : absent de la liste des sponsors de la fondation.
  • « PHP 8 est trois fois plus rapide que PHP 7 » : le chiffre concerne des benchmarks synthĂ©tiques et vient de la RFC JIT ; la mĂȘme page dit que les applications typiques sont au niveau de PHP 7.4.
  • Le « million de lignes de PHP » de Vimeo (dĂ©cembre 2020) : l’article n’est plus en ligne ; l’origine de Psalm chez Vimeo est la seule affirmation que le livre conserve.
  • Tout chiffre sur le nombre de dĂ©veloppeurs PHP dans le monde : le dernier chiffre primaire trouvĂ© est 7,3 millions au troisiĂšme trimestre 2021 (SlashData), et rien de plus rĂ©cent n’a pu ĂȘtre rattachĂ© Ă  une page primaire.

B - Les versions de PHP, 2015 Ă  2026

Chaque version a sa section ci-dessous, avec sa date de sortie, sa fenĂȘtre de support et ses changements marquants. Les dates viennent de php.net (pages des versions maintenues, des fins de vie et des changelogs, vĂ©rifiĂ©es le 17 septembre 2026). Le support actif couvre les corrections de bugs et les correctifs de sĂ©curitĂ©, le support de sĂ©curitĂ© les correctifs de sĂ©curitĂ© seulement. Depuis la mise Ă  jour du cycle de publication votĂ©e en 2024, les deux fenĂȘtres se terminent le 31 dĂ©cembre de leur derniĂšre annĂ©e.

VersionSortieSupport actif jusqu’auSupport de sĂ©curitĂ© jusqu’au
PHP 5.628 août 201419 janv. 201731 déc. 2018
PHP 7.03 déc. 20153 déc. 201710 janv. 2019
PHP 7.11er déc. 20161er déc. 20181er déc. 2019
PHP 7.230 nov. 201730 nov. 201930 nov. 2020
PHP 7.36 déc. 20186 déc. 20206 déc. 2021
PHP 7.428 nov. 201928 nov. 202128 nov. 2022
PHP 8.026 nov. 202026 nov. 202226 nov. 2023
PHP 8.125 nov. 202125 nov. 202331 déc. 2025
PHP 8.28 déc. 202231 déc. 202431 déc. 2026
PHP 8.323 nov. 202331 déc. 202531 déc. 2027
PHP 8.421 nov. 202431 déc. 202631 déc. 2028
PHP 8.520 nov. 202531 déc. 202731 déc. 2029

Ce qu’il faut retenir du tableau, ce sont onze versions annuelles consĂ©cutives, chacune sortie entre le 20 novembre et le 8 dĂ©cembre. Le calendrier de la suivante paraĂźt sur wiki.php.net des mois Ă  l’avance, avec ses dates de gel des fonctionnalitĂ©s et de release candidate.

PHP 7.0, décembre 2015

  • Nouveau moteur, avec une forte rĂ©duction de l’usage mĂ©moire et, sur le travail propre de l’interprĂ©teur, Ă  peu prĂšs deux fois la vitesse de PHP 5.6 ; voir DĂ©bit et latence pour l’affirmation de l’éditeur et la mesure synthĂ©tique indĂ©pendante, avec leurs rĂ©serves.
  • DĂ©clarations de types scalaires (int, float, string, bool) pour les paramĂštres, et dĂ©clarations de types de retour.
  • declare(strict_types=1).
  • OpĂ©rateur de fusion null ??, opĂ©rateur spaceship <=>.
  • Classes anonymes.
  • Les erreurs du moteur deviennent des exceptions (hiĂ©rarchie Error), si bien qu’une erreur fatale peut ĂȘtre attrapĂ©e.
  • Suppression des fonctions mysql_*, des fonctions ereg_* et des constructeurs Ă  la PHP 4.

PHP 7.1 Ă  7.4, 2016 Ă  2019

  • 7.1 : types nullables (?int), type de retour void, iterable, visibilitĂ© des constantes de classe.
  • 7.2 : type object, hachage de mots de passe Argon2, Libsodium dans le cƓur.
  • 7.3 : syntaxe heredoc assouplie, is_countable(), erreurs JSON sous forme d’exceptions.
  • 7.4 : propriĂ©tĂ©s typĂ©es, fonctions flĂ©chĂ©es (fn), prĂ©chargement OPcache, interface de fonctions Ă©trangĂšres (FFI), opĂ©rateur ??=, retours covariants et paramĂštres contravariants.

PHP 8.0, novembre 2020

  • Arguments nommĂ©s : str_pad(string: 'a', length: 3).
  • Attributs : #[Route('/home')], des mĂ©tadonnĂ©es structurĂ©es lues par rĂ©flexion.
  • Promotion de propriĂ©tĂ©s dans le constructeur : public function __construct(private int $x) {}.
  • Types union : int|string $id.
  • Expression match : comparaison stricte, pas de fallthrough, exhaustive.
  • OpĂ©rateur nullsafe : $user?->address?->city.
  • mixed et static comme types.
  • throw comme expression.
  • str_contains(), str_starts_with(), str_ends_with().
  • Interface Stringable, WeakMap.
  • Compilateur JIT, Ă  l’intĂ©rieur d’OPcache.
  • Comparaisons chaĂźne-nombre assainies : 0 == 'foo' vaut false.
  • Les fonctions internes lĂšvent TypeError et ValueError au lieu d’émettre un avertissement et de renvoyer null ou false.

PHP 8.1, novembre 2021

  • ÉnumĂ©rations, pures et adossĂ©es.
  • PropriĂ©tĂ©s readonly.
  • Syntaxe de callable de premiĂšre classe : strlen(...).
  • Fibers : des coroutines Ă  pile, la brique de base des bibliothĂšques asynchrones.
  • new dans les initialiseurs.
  • Types intersection purs : Countable&Traversable.
  • Type de retour never, constantes de classe final, array_is_list(), notation octale explicite.

PHP 8.2, décembre 2022

  • Classes readonly.
  • Types en forme normale disjonctive : (A&B)|null.
  • Types true, false et null autonomes.
  • PropriĂ©tĂ©s dynamiques dĂ©prĂ©ciĂ©es ; #[\AllowDynamicProperties] rĂ©autorise une classe.
  • #[\SensitiveParameter] pour masquer un argument dans les traces d’appel.
  • Constantes dans les traits, Random\Randomizer.

PHP 8.3, novembre 2023

  • Constantes de classe typĂ©es.
  • Attribut #[\Override] : le moteur vĂ©rifie qu’une mĂ©thode parente existe.
  • json_validate().
  • AccĂšs dynamique aux constantes de classe : Foo::{$name}.
  • Les propriĂ©tĂ©s readonly peuvent ĂȘtre rĂ©initialisĂ©es dans __clone().

PHP 8.4, novembre 2024

  • Hooks de propriĂ©té : la logique get et set dĂ©clarĂ©e sur la propriĂ©tĂ© elle-mĂȘme.
  • VisibilitĂ© asymĂ©trique : public private(set) int $x.
  • new Foo()->bar() sans parenthĂšses englobantes.
  • Objets paresseux via la rĂ©flexion (newLazyGhost(), newLazyProxy()).
  • Attribut #[\Deprecated].
  • array_find(), array_find_key(), array_any(), array_all().
  • mb_trim() et consorts, mb_ucfirst(), mb_lcfirst().
  • Nouvelle extension DOM avec un analyseur HTML5 (Dom\HTMLDocument).
  • API objet pour BCMath (BcMath\Number), sous-classes PDO par pilote (Pdo\Sqlite, Pdo\Mysql, Pdo\Pgsql).
  • Types de paramĂštres implicitement nullables dĂ©prĂ©ciĂ©s.

PHP 8.5, novembre 2025

  • OpĂ©rateur pipe : $value |> trim(...) |> strtoupper(...).
  • clone avec mise Ă  jour de propriĂ©tĂ©s : clone($obj, ['prop' => $value]).
  • Attribut #[\NoDiscard], avec le cast (void) pour le faire taire volontairement.
  • array_first(), array_last().
  • Closures et callables de premiĂšre classe dans les expressions constantes (arguments d’attributs, valeurs par dĂ©faut, constantes).
  • Attributs sur les constantes.
  • Nouvelle extension uri (Uri\Rfc3986\Uri, Uri\WhatWg\Url).
  • Les erreurs fatales incluent une trace d’appel.
  • get_error_handler(), get_exception_handler().
  • L’opĂ©rateur d’exĂ©cution shell entre accents graves est dĂ©prĂ©ciĂ©.

C - Glossaire

Les termes que j’emploie et que vous pouvez ne pas connaĂźtre si vous venez d’un autre Ă©cosystĂšme, dans l’ordre alphabĂ©tique des termes anglais.

Active support (support actif). Les deux premiĂšres annĂ©es d’une branche de PHP, pendant lesquelles les bugs et les failles de sĂ©curitĂ© sont corrigĂ©s dans des versions de correction mensuelles. Suivent deux annĂ©es de support de sĂ©curitĂ©, avec des correctifs de sĂ©curitĂ© seulement. Voir Gouvernance et pĂ©rennitĂ©.

Composer. Le gestionnaire de dĂ©pendances de l’écosystĂšme PHP, comparable Ă  npm, pip ou Maven. Il lit composer.json, rĂ©sout les versions, Ă©crit composer.lock et gĂ©nĂšre l’autoloader qui fait correspondre les noms de classes aux fichiers.

Fiber. Une coroutine Ă  pile, ajoutĂ©e dans PHP 8.1 : une fonction qui peut se suspendre elle-mĂȘme et ĂȘtre reprise plus tard par qui la dĂ©tient. Le langage fournit le mĂ©canisme, rien de plus, et l’ordonnancement revient aux bibliothĂšques. Voir Concurrence.

FrankenPHP. Un serveur d’application pour PHP, Ă©crit en Go au-dessus du serveur web Caddy. Il exĂ©cute PHP soit dans le mode classique d’un processus par requĂȘte, soit dans un mode worker qui garde l’application dĂ©marrĂ©e entre les requĂȘtes. Voir Le runtime.

Hack et HHVM. Hack est un langage qui a divergĂ© de PHP chez Facebook en 2014, et HHVM est sa machine virtuelle. HHVM a abandonnĂ© la prise en charge de PHP lui-mĂȘme en 2019. Les organisations qui font tourner Hack ne font pas tourner PHP, et je ne les compte pas comme utilisatrices de PHP.

JIT. Le compilateur Ă  la volĂ©e livrĂ© Ă  l’intĂ©rieur d’OPcache depuis PHP 8.0, qui compile les chemins de code chauds en code machine. Il profite bien plus au code limitĂ© par le CPU qu’aux requĂȘtes web ordinaires, et je le rappelle partout oĂč un chiffre JIT apparaĂźt.

NTS et ZTS. Les builds non-thread-safe et Zend-thread-safe de l’interprĂ©teur. Le build standard est NTS, parce que le modĂšle par processus n’a jamais eu besoin de threads. Les builds ZTS existent pour l’usage embarquĂ© et pour l’extension parallel.

OPcache. L’extension qui garde la forme compilĂ©e de chaque fichier PHP en mĂ©moire partagĂ©e, si bien qu’un fichier est analysĂ© et compilĂ© une fois plutĂŽt qu’à chaque requĂȘte. Elle est standard en production depuis PHP 5.5.

p50, p95, p99. Les centiles d’une distribution de latence : le temps de rĂ©ponse sous lequel 50, 95 ou 99 % des requĂȘtes se terminent. Un benchmark qui ne rapporte que la moyenne cache la queue de distribution, et c’est pourquoi je prĂ©fĂšre les sources qui publient des centiles.

Packagist. Le registre public de paquets que Composer utilise par défaut, comparable à npmjs.com ou PyPI.

PER Coding Style. Le standard de style de code maintenu par le PHP-FIG, successeur de PSR-12. Des outils tels que PHP-CS-Fixer et PHP_CodeSniffer le font respecter.

PHP-FIG. Le PHP Framework Interoperability Group, qui publie les standards PSR pour que les bibliothĂšques d’auteurs diffĂ©rents s’emboĂźtent.

PHP-FPM. Le FastCGI Process Manager, la façon standard d’exĂ©cuter PHP derriĂšre un serveur web. Il entretient un pool de processus worker, chacun traitant une requĂȘte Ă  la fois.

Preloading (prĂ©chargement). Une fonctionnalitĂ© d’OPcache (PHP 7.4) qui compile une liste de fichiers une fois au dĂ©marrage et les garde liĂ©s en mĂ©moire, si bien qu’aucune classe n’a besoin d’autoloading pendant une requĂȘte.

PSR. PHP Standards Recommendation, un standard d’interopĂ©rabilitĂ© numĂ©rotĂ© publiĂ© par le PHP-FIG : PSR-4 pour l’autoloading, PSR-3 pour la journalisation, PSR-7 pour les messages HTTP, et ainsi de suite.

Rector. Un outil qui réécrit le code PHP automatiquement : il fait monter la syntaxe d’une version Ă  la suivante, applique des refactorings et supprime les appels dĂ©prĂ©ciĂ©s. Les Ă©quipes s’en servent pour les montĂ©es de version Ă  grande Ă©chelle.

RFC. Request for Comments, le document par lequel tout changement du langage est proposé, discuté sur la liste de diffusion internals et soumis au vote. Un changement du langage requiert une majorité des deux tiers. Voir Gouvernance et pérennité.

RoadRunner. Un serveur d’application pour PHP Ă©crit en Go. Il garde des processus worker en vie et leur transmet les requĂȘtes par un protocole, si bien que l’application est dĂ©marrĂ©e une fois plutĂŽt qu’à chaque requĂȘte.

Shared-nothing. Le modĂšle d’exĂ©cution dans lequel chaque requĂȘte dĂ©marre avec une mĂ©moire vierge, s’exĂ©cute, rĂ©pond et est jetĂ©e, sans rien partager avec la requĂȘte prĂ©cĂ©dente ni la suivante. La plupart des propriĂ©tĂ©s opĂ©rationnelles de PHP en dĂ©coulent. Voir Le runtime.

Static analysis (analyse statique). Lire le code sans l’exĂ©cuter, pour y trouver les erreurs de type et d’autres dĂ©fauts. PHPStan et Psalm sont les deux analyseurs de l’écosystĂšme PHP, et tous deux comprennent une syntaxe de types en docblock plus riche que celle du langage lui-mĂȘme.

Swoole et OpenSwoole. Une extension en C et son fork. Chacune donne Ă  PHP une boucle d’évĂ©nements, des coroutines et un serveur HTTP intĂ©grĂ©, pour les charges de travail qui ont besoin de nombreuses connexions concurrentes dans un seul processus.

TechEmpower Framework Benchmarks. Une suite de benchmarks publique, exĂ©cutĂ©e en continu, qui compare des centaines de frameworks web de tous langages sur un jeu de tests fixe (sĂ©rialisation JSON, requĂȘtes de base de donnĂ©es simples et multiples, rendu HTML « fortunes », plaintext). Je la cite avec son numĂ©ro de round, son matĂ©riel et le test, et je dis ce que chaque test mesure.

W3Techs. Une sociĂ©tĂ© d’enquĂȘtes sur le web qui publie l’usage des technologies cĂŽtĂ© serveur sur un Ă©chantillon de plus de vingt millions de sites. Ses chiffres ne comptent que les sites dont le langage peut ĂȘtre dĂ©tectĂ©, ce qui les biaise d’une maniĂšre que je prĂ©cise quand je les utilise.

Worker mode (mode worker). Une façon d’exĂ©cuter PHP dans laquelle l’application est dĂ©marrĂ©e une fois et gardĂ©e en mĂ©moire, chaque processus worker traitant de nombreuses requĂȘtes Ă  la suite. FrankenPHP et RoadRunner le proposent, entre autres. Il supprime le coĂ»t de dĂ©marrage par requĂȘte, au prix de la garantie shared-nothing.