Le blog

Retour sur le Forum PHP 2024 - jour 1

Publié le 15 octobre 2024

Les portes du Forum PHP 2024 se sont fermées la semaine dernière, après deux jours intenses durant lesquels plus d'une trentaine de conférencières et conférenciers se sont partagé trois scènes à l'Hôtel New York - The Art of Marvel, un lieu flambant neuf et plus que confortable pour accueillir 700 participant·es, tout en rendant hommage à certains de nos super-héros préférés. Comme chaque année depuis presque une décennie, nous avons participé en grand nombre à cet événement organisé par l'AFUP. Cerise sur le gâteau, nous avions un stand en tant que sponsor Or. Découvrez dans cet article les conférences qui nous ont marqués le jeudi 10 octobre dernier !

Devanture de l'Hôtel New York - The Art of Marvel, dans le cadre du Forum PHP 2024" class="wp-image-9944

What’s new in PHP 8.4? #

Derick Rethans, le créateur de Xdebug et membre de la PHP Foundation, a abordé plusieurs nouvelles fonctionnalités et améliorations de la dernière version de PHP, notamment : 

  • La Visibilité Asymétrique, qui permet de combiner la visibilité d'une propriété et de son setter. 
  • Les Hooks de Propriété, qui permettent de concaténer la déclaration d'une propriété avec ses méthodes getter/setter (utiles pour la validation et la construction de valeurs). 
  • La possibilité d’accéder directement à la nouvelle instance d’un objet sans devoir la wrapper avec des parenthèses, afin de simplifier le code. 

PHP 8.4 améliore également les performance du compilateur JIT, introduit des attributs #[\Deprecated] pour marquer les éléments obsolètes, et améliore la gestion des pilotes des sous-classes PDO. Derick nous a également présenté d'autres nouveautés qui incluent des modes d'arrondi, une mise à jour du coût de bcrypt et une gestion correcte des emojis dans les chaînes de caractères. La cycle de sortie de PHP a également été modifié pour prolonger les périodes de RC et de support.

Écrit par Vincent Amstoutz et Vincent Chalamon.

Créer sa Malware Sandbox en PHP #

Alexandre Daubois a abordé la sécurité des fichiers uploadés par les utilisateurs lors de tests de pénétration. Il a souligné les lacunes des applications auditées : les anciens endpoints n'effectuaient aucune analyse et les nouveaux se limitaient à vérifier la taille et l'extension des fichiers. Il a évoqué plusieurs options qui permettent d’améliorer la sécurité, dont la création d'un antivirus ou d'une sandbox permettant d’effectuer une analyse simplifiée.

Il a présenté trois méthodes pour un antivirus : heuristique statique (détection de motifs), heuristique dynamique (exécution dans une VM) et vérification de signature (hash). Dans le cas étudié, une sandbox s'avère plus adaptée, avec des vérifications sur les noms de fichiers et les Magic Bytes, le tout avec des précautions particulières pour les archives. Des solutions comme ClamAV peuvent être utilisées pour des besoins plus complexes.

Écrit par Thibaut Arnoud.

L'équipe technique vue comme un orchestre : l'individu au service du groupe #

Adriana Vizinho a débuté sa conférence en partageant son expérience en tant que joueuse de flûte semi-professionnelle et de manageuse technique au sein de Deezer, son idée étant d’établir une analogie entre une équipe de développement et un orchestre. Avec quelques touches d’humour, elle a passé en revue les points communs qu’elle observe : l’organisation hiérarchisée, l’omniprésence des process, la composition des effectifs et leur niveaux, la cohésion à travers l’engagement individuel et collectif…

Elle a poursuivi en détaillant le rôle, l’objectif et les qualités d’un chef d’orchestre puis est revenue sur le rôle de manageuse technique en posant le principe suivant : faire au mieux avec l’équipe qu’on a. Loin d’être un sujet technique, la conférencière a néanmoins proposé un sujet intéressant pour les développeurs et développeuses qui sont ou seront amenées à gérer une équipe.

Écrit par Julien Lary.

Les nouveautés dans Symfony 7.x #

Après une présentation rapide de ce qu’est Symfony, l’ensemble des composants ainsi que le framework, Nicolas Grekas a poursuivi sa conférence en détaillant le fonctionnement des livraisons des différentes versions. Il recommande d’effectuer régulièrement  la mise à jour des dépendances et d’introduire cette bonne pratique dans les processus réguliers des équipes de développement.

Le principal mainteneur de Symfony a ensuite évoqué les nouveautés des versions 7.x, en indiquant au passage que la version 7.2 sera livrée début décembre. Il a rappelé les transformations apportées à Symfony pour mieux épouser l’évolution du langage, comme le typage des propriétés, l’utilisation des génériques ou des nouvelles syntaxes comme la promotion des propriétés dans le constructeur. L’intégration de PHPUnit 11 est également prévue et elle signera la mort du bridge PHPUnit. Il a ensuite listé les nouveaux composants introduits depuis le début de cette année : HtmlSanitizer, Clock, RemoteEvent, Webhook, Scheduler (dont notre coopératrice Allison Guilhem a parlé lors de la dernière SymfonyCon), AssetMapper (dont notre coopérateur Kévin Dunglas parlait au dernier SymfonyLive). Sont passés également en revue les nouveaux attributs utilisables pour injecter des dépendances et dans les contrôleurs. Nicolas a terminé sa conférence en abordant l’ensemble des ajouts et modifications notables sur les composants existants dans Symfony et ceux en étude comme ObjectMapper, réalisé par notre coopérateur Antoine Bluchet. 

Vous pouvez retrouver une présentation complète des nouveautés de Symfony dans nos articles de blog dédiés. 

Écrit par Julien Lary.

Comment déboguer Xdebug... ou n'importe quel autre bug bizarre en PHP #

Kévin Dunglas nous a partagé son retour d’expérience concernant la correction d’un bug dans Xdebug, en détaillant la méthodologie appliquée par ses soins. Il a commencé par présenter un arbre de décision permettant de déterminer la source du problème, qu'il s'agisse de la librairie, d'un mauvais usage ou de son code. Le bug sur lequel il se concentre a été signalé par différents utilisateurs sur plusieurs projets, lié à l’usage d’Xdebug dans une image Docker prévue pour Symfony, mais également à Octane (Laravel), dans les deux cas en lien avec l’utilisation de FrankenPHP.

Pour reproduire le bug, il a créé un projet minimal et collecté des informations (à partir notamment de GNU Debugger ou LLDB), malgré les défis posés par Xdebug lui-même. Il nous a recommandé de recompiler PHP et Xdebug pour garantir une base stable. Avec GDB, il a débogué Xdebug pour obtenir des backtraces, tout en notant les limites de cet outil. Kévin a souligné l'importance d'ajouter du contexte sur les versions de PHP utilisées, et de savoir se documenter pour identifier la source du bug. Une fois le bug localisé, il a pu proposer une solution et contribuer à la librairie open source, en insistant sur l'importance de bien communiquer lors de la création d’un rapport de bug pour éviter les clôtures de sujets pour manque d'informations.

Écrit par Vincent Amstoutz et Vincent Chalamon.

StandAAArdisez vos tests ! #

Nerea Enrique nous a présenté le pattern AAA, introduit par Bill Wake en 2001, visant à structurer les tests pour en améliorer l'efficacité.

Ce pattern se compose de trois étapes : Arrange, Act, Assert. Un bon test doit être maintenable, rapide et savoir protéger contre les régressions. Plusieurs stratégies de tests existent, telles que les tests unitaires, qui se concentrent sur des portions de code spécifiques, et les tests d’intégration, qui examinent des fonctionnalités dans leur ensemble, y compris les dépendances. Les tests de bout en bout (E2E) évaluent l'application dans son intégralité. Le Test Data Builder pattern peut faciliter l'étape d'Arrange tout en évitant la duplication de code. 

Nerea a terminé sa conférence en soulignant que bien que le pattern AAA soit utile, il est essentiel de l'enrichir avec d'autres méthodes pour garantir la qualité des tests.

Écrit par Vincent Chalamon.

PHP/Parallel : Accélérer sensiblement ses temps d'exécution #

En 2020, en pleine pandémie, Thierry Kauffmann et son équipe ont été missionnés par le ministère de l’Éducation Nationale pour mettre en place un système de visioconférence basé sur le logiciel libre BigBlueButton. Jusqu’à 150 serveurs ont été nécessaires pour tenir la charge.

Thierry et son équipe ont réalisé un système permettant de répartir la charge entre les différents serveurs et à l’infrastructure de s’adapter en temps réel : pour réduire les coûts financiers comme écologiques de la plateforme, des machines sont provisionnées uniquement quand elles sont nécessaires (soit parce que la charge augmente, soit parce qu’un événement est prévu dans l’agenda de l’outil) et arrêtées quand elles ne le sont plus.

Cet orchestrateur nommé DiViM-S, est un logiciel libre écrit en PHP et développé par Thierry. Pour optimiser la consommation de ressources de l’orchestrateur lui-même et lui permettre d’être le plus réactif possible, Thierry a décidé d’utiliser PHP d’une manière un peu atypique, mais redoutablement efficace : en utilisant des threads pour paralléliser l'exécution.

Pour ce faire, Thierry a utilisé l'extension parallel. Cette extension, développée par Joe Watkins (qui a actuellement besoin de l’aide financière de la communauté), propose une API facile à utiliser, très similaire aux Goroutines du langage de programmation Go, permettant de lancer facilement des tâches en parallèle et de les faire communiquer.

Seul petit problème, il faut compiler PHP en mode thread-safe (ZTS) pour pouvoir l’utiliser, ce qui n’est pas le cas par défaut des versions de PHP fournies par les distributions Linux populaires. Fort heureusement, comme l'a montré Thierry, notre serveur d’application FrankenPHP, qui utilise aussi le mode thread-safe de PHP, est quant à lui facile à installer, et est 100% compatible avec parallel puisque l’extension est même désormais présente dans le binaire statique de FrankenPHP. Vous n’avez plus d’excuse pour ne plus utiliser cette extension ! N’hésitez pas à regarder le talk de Thierry pour une introduction accessible et complète de l’outil.

Écrit par Kévin Dunglas.

CTE : la puissance inexploitée de votre base de données SQL #

Timothée Martin a présenté les CTE (Common Table Expressions), une fonctionnalité méconnue des bases de données relationnelles, souvent ignorée à cause des ORM qui ne les supportent pas. Introduites dans plusieurs SGBD depuis 2005 (SQL Server) et jusqu'à MySQL 8, les CTE utilisent le mot clé "WITH" pour diviser une requête en une partie définissant la CTE et une requête principale qui l’utilise.

Les CTE offrent une alternative aux sous-requêtes, améliorant la clarté et la structure des requêtes, notamment pour des calculs complexes comme peut l’être par exemple le score Elo . Elles peuvent être chaînées, utilisées dans des instructions de modification (INSERT, UPDATE, DELETE), et permettent des requêtes récursives, essentielles pour parcourir des graphes.

Les avantages incluent une meilleure lisibilité, maintenabilité, et performance, tandis que le principal inconvénient est leur manque de support par les ORM. Pour contourner cela, il est toutefois possible de créer des vues et de les mapper en lecture seule sur des entités.

Écrit par Nicolas Philippe.

Le grand cycle de la vie (d’une variable) #

Le talk de Benoit Viguier, développeur senior chez Lendable, a abordé la gestion de la mémoire en PHP. Bien que le moteur Zend Engine gère automatiquement cette mémoire, il a expliqué comment cette dernière est allouée, notamment via la méthode "copy and write" pour les tableaux, tout en soulignant que les objets ne bénéficient pas des mêmes optimisations.

Benoit a ensuite détaillé le processus de destruction et présenté des outils de débogage, comme gc_status, pour surveiller l'état du garbage collector. Il a recommandé d'éviter les exceptions dans les destructeurs et de ne pas détruire les propriétés faisant référence à l'instance.

Il nous a également présenté les WeakReference, permettant de garder une référence à un objet sans en empêcher sa destruction, utiles pour des structures de type cache. Il a terminé sa conférence en présentant les WeakMap, similaires aux tableaux, mais dans lesquelles les références sont automatiquement supprimées lorsque l'objet est effacé.

Écrit par Vincent Amstoutz.

throw new Exception(); Oui mais laquelle ?! #

Olivier Dolbeau a abordé l’usage des exceptions en programmation, en précisant qu'une exception n'est pas un bug, mais une condition exceptionnelle permettant de gérer les différentes situations des cas normaux. 

Son utilisation varie selon le contexte : dans une librairie, il est crucial de permettre aux utilisateurs de gérer les erreurs comme ils l'entendent, en prévoyant une granularité d'exceptions suffisante, avec une interface commune et en évitant de lancer des exceptions externes. Dans un projet final, l'objectif est de gérer des erreurs utiles et prévues. Pour choisir quelle exception lancer, il nous a conseillé de privilégier les exceptions existantes et de ne créer des exceptions spécifiques que si nécessaire, et d'utiliser les exceptions natives de PHP seulement quand aucune autre ne convient. Le pragmatisme est essentiel : réutiliser, créer, et ne pas attraper toutes les exceptions.

Écrit par Vincent Chalamon.

Un parser de PHP en PHP : le cœur des outils d'analyse statique #

Mathieu Noël est revenu sur l’utilisation des parsers. Un parser PHP écrit en PHP sert à analyser et comprendre le code en produisant un AST (Arbre Syntaxique Abstrait). Ce processus s’effectue en deux étapes : un lexer découpe le code en tokens, puis ces tokens sont transformés en AST. Le PHP-Parser de Nikita Popov est le plus connu et le plus largement utilisé dans divers outils : linters, analyse statique, analyse de la complexité, refactorisation et architecture.

Il est par exemple employé pour dumper l’AST (avec NodeDumper), parcourir l’arbre (avec NodeTraverser) ou résoudre des namespaces (avec NameResolver). Des outils comme PHPStan vérifient les types et Rector permet de remplacer des nœuds.

Mathieu Noël souligne que PHP-Parser influence le développement de PHP, notamment lors de l’ajout de nouvelles fonctionnalités, et que des alternatives existent (Tolerant PHP Parser, PXP, php-ast), mais que ces dernières restent limitées. Enfin, Mathieu a plaidé pour l’intégration native d’un parser dans PHP en soulignant l’importance d’un tel outil.

Écrit par Alan Poulain.

De "0" à "tracing distribué" en quelques lignes de code, c'est possible ! #

Vincent Lepot a commencé sa conférence en présentant un exemple d’application basée sur une architecture distribuée et permettant d’enregistrer des listes de films. Il a testé en direct son application et est tombé sur deux problèmes, un concernant la performance et l’autre, une erreur. Afin d’avoir plus d’informations sur les problèmes rencontrés, il a mis en place de l’observabilité et plus précisément le troisième pilier, les traces, et en l’occurrence les traces distribuées.

Il a poursuivi sa présentation avec un outil qui permettra d’identifier l’origine des problèmes : OpenTelemetry. Il a détaillé les quatre étapes qui permettent de l’utiliser : 

  • Choisir un backend de stockage (open source ou en SaaS), ici Grafana Tempo.
  • Installer les extensions PHP nécessaires : http/protobuf pour le transport optimisé, opentelemetry pour ajouter une fonction hook qui permet d’encapsuler les appels à des fonctions ciblées (grâce à l’API Observer ajoutée dans PHP 8).
  • Installer des packages Composer d’auto-instrumentation qui vont ajouter les hooks sur des fonctions ciblées des briques logicielles déjà existantes (Symfony, Laravel, PDO…)
  • Configurer OpenTelemetry dans les applications pour émettre les traces.

Une fois les traces remontées dans le backend, il est possible de filtrer sur différents critères : erreurs, temps de réponse etc.Grâce à ces traces, il devient bien plus simple de surveiller la performance des services et de l’améliorer.

Mais pourquoi rechercher à améliorer la performance ? Vincent nous a proposé plusieurs réponses à cette question : pour améliorer l’expérience utilisateur, pour améliorer les performances économiques (pour un site e-commerce, de meilleurs temps de réponse contribuent à améliorer le chiffre d'affaires) et enfin d’augmenter la durée de vie du matériel.

Écrit par Julien Lary.

Resurrecting the Dead #

Juliette Reinders est aujourd’hui la mainteneuse de Requests et PHP Parallel Lint sans toutefois être la créatrice de ces librairies. Elle a commencé par soumettre des correctifs, puis est devenue mainteneuse de PHP_CodeSniffer après son abandon. Un projet open source peut être populaire, mais il finit parfois par être laissé à l’abandon pour des raisons liées à la vie personnelle ou à l'épuisement des mainteneurs. Pour relancer un projet, on peut soit transférer son administration à quelqu’un d’autre, soit forker le dépôt d’origine (mais cela entraîne la perte de certaines données).

Un projet “sain” est généralement administré par plusieurs personnes et il est nécessaire d’anticiper son éventuelle succession, ce qui implique de préparer le terrain avec de la documentation, de la formation et des financements. Le maintien en vie d’un projet ne se limite pas à corriger ses bugs, mais aussi à le faire évoluer fonctionnellement. Les entreprises qui profitent des logiciels open source devraient contribuer financièrement pour garantir une meilleure pérennité des logiciels utilisés. PHP_CodeSniffer est toujours actif, avec des mises à jour et un support des nouvelles versions de PHP. Pour aider, il faut connaître ses dépendances, contribuer et financer.

Écrit par Vincent Chalamon.

PMU : un plugin Composer pour la gestion de monorepository en PHP #

Dans son talk, Antoine Bluchet a présenté PHP Mono-Repository Utility (PMU), un outil créé par ses soins pour gérer un monorepo en PHP. Il a commencé par définir les concepts mobilisés : un monorepo est un dépôt contenant plusieurs projets, à l’opposé du polyrepo où chaque application dispose de son propre dépôt. Antoine en a profité pour souligner que les équipes qui travaillent en polyrepo sont souvent isolées les unes des autres, ce qui tend à compliquer la communication et la gestion des outils CI/CD.

Il a ensuite comparé des outils monorepo qui existent pour d'autres langages comme Lerna, Nx.dev, Bazel, et Turborepo. Pour PHP, il a mentionné Mono (très lié à Git) et simplify/monorepo-builder (nécessitant une configuration complexe). Pour API Platform 4, Antoine a préféré utiliser splitsh/lite pour réorganiser le projet, mais en constatant l’absence de certaines fonctionnalités dont il avait besoin, il a décidé de créer PMU.

PMU étend Composer avec des fonctionnalités comme un graphe des dépendances (composer graph), la validation (composer check-dependencies), et la commande composer blend pour gérer les dépendances. Une des innovations majeures est le Project Linking, qui crée des liens symboliques dans les vendors pour faciliter la gestion des projets.

Écrit par Vincent Amstoutz.

Une gestion dynamique des permissions en PHP #

Notre co-gérante Marion Agé a commencé par introduire les notions clés d'un système de gestion des permissions : utilisateur.rice, ressource, rôle et permission. Elle a ensuite présenté plusieurs concepts qui s'appuient sur ces notions clés :  l'authentification, l'autorisation ainsi que différents modèles de contrôle d'accès (DAC, MAC, RBAC, ABAC).

Marion Agé sur la scène du Forum PHP 2024" class="wp-image-9946

Dans Symfony, les Voters permettent de centraliser la logique d’autorisation. La méthode IsGranted déclenche ces Voters. Marion a souligné les limites des systèmes basés sur les rôles et a défendu un système davantage flexible et configurable, dans lequel l'admin peut modifier finement les permissions sans toucher au code.

Pour implémenter une solution sur-mesure, elle a recommandé de définir les besoins métiers, de stocker et évaluer les permissions en base de données, et d’optimiser les performances (via le lazy loading des Voters, de l’indexation ou du cache). Elle a également suggéré  d'exposer ces permissions au frontend via le JWT ou via une API, et de gérer le stockage avec CASL et Mercure pour mettre à jour les permissions en temps réel.

D’après elle, toutes ces recommandations constituent une solution qui permet une gestion fine et dynamique des permissions en toute sécurité.

Écrit par Vincent Chalamon.

How to Eliminate Waste in your Development Process #

Après une rapide présentation de la notion de gaspillage (waste), Matthias Noback a axé sa présentation autour de deux leviers apportant selon lui des solutions à la fois pour détecter et pour corriger ses pertes de temps. 

Le premier levier est de favoriser le travail en équipe par rapport au travail individuel. Confronter sa façon de travailler avec d’autres développeurs permettra d’identifier plus facilement les tâches chronophages ou propices aux erreurs. Les autres effets bénéfiques sont notamment un meilleur partage des connaissances, une livraison plus rapide, une détection plus rapide des pertes de temps. Matthias a notamment recommandé le pair-programming et le mob-programming.

Le deuxième levier consiste à synchroniser le plus possible le processus d’apport de valeur avec le processus de travail. À travers une analyse poussée des processus souvent utilisés et de la théorie, il a évoqué la méthode Scrum, la méthode Mikado et l’amélioration continue parmi d’autres, tout en rappelant l’importance de concentrer sur la livraison de valeur pour les utilisateurs. Plusieurs signes de dysfonctionnement sont énumérés, en particulier les pièges souvent liés à un formalisme excessif des équipes par rapport aux méthodes de travail.

Écrit par Julien Lary.

PHP: Particularly Horrible Programs #

Gina Banyard, core contributrice à PHP via la PHP Foundation, nous a une fois de plus offert une présentation à la fois originale et technique.

Pendant 40 minutes, elle a exécuté une suite d’exemples concoctés durant ses tribulations dans le code de PHP, afin de nous exposer les bizarreries du langage (qu’elle a souvent corrigées par la suite). La majorité du code est basé sur la coercion de types de PHP et le type juggling.
Présentation amusante et remplie d’auto-dérision, on n’oubliera néanmoins pas que beaucoup de ces bizarreries sont facilement évitables en activant le mode strict de PHP !

Écrit par Alan Poulain.

Un peu plus près des étoiles #

Pour la première conférence alien du Forum PHP 2024 (des conférences en marge de la programmation sur des sujets annexes), Albane Veyron a réalisé une présentation digne des TED talks : travaillée, interactive et belle. Filant le thème du rêve, elle nous a présenté son parcours professionnel pour le moins original, puisqu’elle a quitté le domaine de l’astrophysique pour rejoindre aujourd’hui celui du coaching professionnel. Distillant à la fois des savoirs astronomiques et des anecdotes personnelles, nous interpellant sur ce qui nous fait rêver ou nous pousse à la curiosité dans la vie, ce talk était parfait pour finir cette première journée en beauté !

Écrit par Alan Poulain.

Atelier API Platform et une présence aux lightning-talks #

Antoine Bluchet a animé un atelier montrant comment utiliser API Platform (avec Symfony et avec Laravel s’il vous plaît !) en commençant par ses fonctionnalités RAD, pour ensuite complexifier au fur et à mesure l’application en introduisant des patrons de conception comme CQRS et des approches avancées comme DDD, le tout grâce aux Providers et Processors.

Pendant ce temps, notre autre collègue Clément Talleu a profité des lightning talks pour présenter une bibliothèque qu’il vient de publier : PHP Redis OM. Cet Object Mapper qui s’utilise de manière similaire à Doctrine ORM permet de tirer partie des structures de données hash et JSON de Redis pour y stocker directement des objets PHP. Redis étant une technologie extrêmement rapide, cette nouvelle bibliothèque bien utilisée peut permettre d’améliorer considérablement la performance de vos applications PHP. N’hésitez pas à l’essayer et à lui mettre une étoile sur GitHub !

Ne manquez pas la suite de notre retour dans quelques jours sur notre blog !

Le blog

Pour aller plus loin