Une fonction PHP temporaire de 2014 à 20M installations, finalement dépréciée
En bref
- Jake Smith a écrit en 2014 une fonction PHP de 174 lignes pour remplacer http_build_url() supprimée lors d'une migration PHP 5.2 → 5.3 chez AOL.
- Cette fonction temporaire s'est retrouvée sur Packagist et installée 20 millions de fois, intégrée directement par WPML (1,5M sites) et embarquée dans Debian/Ubuntu.
- Smith la marque dépréciée aujourd'hui, pointant PHP 8.5 (URI API native) et la PHP League (URI library) comme alternatives.
- Un bug de 12 ans où les slashes finaux causent la suppression des "a" du chemin est resté inaperçu, jamais corrigé par prudence : un changement pourrait casser des installations.
- L'auteur refuse de transférer le maintenaning pour limiter les risques de sécurité post-xz-utils.
Ce que dit la source
Jake Smith raconte comment il a écrit un polyfill pour remplacer http_build_url(), une fonction PECL supprimée lors de la migration PHP 5.3 chez AOL. Cet expédient de 174 lignes, publié sur Packagist au moment où Composer prenait son essor, était censé être temporaire. Douze ans plus tard, il dénombre 20 millions d'installations officielles sur Packagist, 400 000 par mois, plus les copies embarquées dans WPML, idna-convert, SPIP et les dépôts Debian/Ubuntu. Smith explique pourquoi il déprécie maintenant le paquet : PHP 8.5 propose une API URI native conforme aux standards, la PHP League offre une alternative robuste, et maintenir un vieux code polyfill retarderait l'adoption de solutions meilleures. Il refuse aussi de le transférer, malgré trois volontaires, pour éviter le risque de sécurité incarné par la backdoor xz-utils : un paquet très installé avec un nouveau mainteneur non vérifié serait une cible d'attaque idéale.
- Un bug de 12 ans : le code contient une contournement à base d'"a" pour gérer les slashes finaux, où une simple remplacer supprime tous les "a" d'un chemin quand l'URL se termine par "/"
- La fonction est embarrassée un peu partout : directement dans le code de WPML (plugin multilingue WordPress, 1,5M sites), dans idna-convert, dans SPIP, et ensuite packagée en Debian/Ubuntu
- Smith a demandé un mainteneur en 2021, trois candidats se sont proposés, mais il a abandonné après un deuil familial et oublié le package durant des années
- Même un bugfix d'une ligne pose risque : après une décennie sans changement, un correctif pourrait casser une application dépendante quelque part, avec personne pour l'assister
- PHP 8.5 intègre une URI API native standardisée ; la PHP League's URI library est la réponse communautaire depuis des années
Dans les commentaires
Débat partagé entre la nostalgie technique ("rien n'est plus permanent qu'un fix temporaire") et la reconnaissance que c'était une mauvaise décision de l'épendre aussi largement, couplée à du respect pour la rigueur de son choix de dépreciation.
- Plusieurs commentateurs soulignent le paradoxe : le bug du "a" aurait dû casser des sites depuis 12 ans, pourtant personne ne s'en est plaint visiblement, ce qui confirme l'observation de Hyrum's Law (à 20M installs, quelqu'un utilise probablement ce bug comme feature)
- Un commentateur note que l'auteur aurait pu au moins ajouter une notice de dépreciation explicite avec liens de migration, pour aider les développeurs découvrant le package via de vieilles réponses Stack Overflow
- La question de l'archivage GitHub est posée : archiver un repo mort est plus lisible qu'un paquet deprecated qui continue de s'installer
- Contexte PHP critiqué : les extensions PECL optionnelles ont toujours forcé les hébergeurs à écrire des polyfills, d'où la prolifération de petits paquets qui deviennent involontairement critiques
- Un autre mainteneur partage son expérience similaire : son projet PHP (php-restclient, 3M+ installs) a aussi dépassé largement ses attentes sans effort de sa part
Notre lecture
La dépreciation est la bonne décision, même si elle arrive tard : laisser traîner un vieux polyfill avec un bug critique dans 20M d'installs, c'est accepter un risque de sécurité invisible. Le refus de transférer la maintenance, malgré trois candidats, montre une compréhension solide du problème xz-utils. Pour les DSI : aucune action immédiate, mais c'est un cas d'école de dette technique qui devrait rappeler que bundler les dépendances (comme WPML l'a fait) cache les cycles de vie upstream. Les équipes PHP devraient trier les usages locaux et migrer progressivement vers PHP 8.5 ou la PHP League. Intéressant aussi comme illustration des limites du modèle PECL et de la fragmentation de l'écosystème PHP.