Le Symfony Live (suite)

Peaks au Symfony Live 2019

Après ces deux jours au Symfony Live 2019 à Paris, j’ai envie maintenant de vous partager mon ressenti et vous présenter surtout ce qui va nous servir nous, développeurs, pour travailler plus efficacement.  

Les conférences sont à destination des développeurs. C’est technique, y’a du code, c’est du concret ! Et c’est très bien ainsi. On nous présente des composants, des méthodes, des cas particuliers. Après ces deux jours, on ne peut que constater que Symfony continue dans sa philosophie initiée avec Flex, ce n’est plus seulement un framework mais bien un écosystème de composant open source qui travaille en symphonie. Parmi les conférences que j’ai trouvées les plus utiles et intéressantes, je vais vous présenter celle sur Doctrine, et celles sur HTTP : HTTP3 et le nouveau composant HTTP.

Doctrine en profondeur

Tout développeur de Symfony connait Doctrine l’ORM par défaut, mais il s’avère qu’on ne connait pas aussi bien ce composant qu’il n’y parait.  On nous a vendu Doctrine comme un système magique qui est capable de tout faire tout seul. Pour ceux qui adhéraient au mythe, cette conférence vient le casser. 

En effet, Doctrine peut être une catastrophe en termes de performances si les entités sont configurées “par défaut”, le principal problème à ceci : les relations entre entités. 

Le lazyloading, ami ou ennemi ? 

Mal exploité, le lazyloading peut ironiquement tuer les performances de l’application en multipliant les requêtes. 

Parmi les solutions, on a : 

  • Le plus atypique : l’hydratation partielle où l’on ne récupère qu’une partie de l’objet 
  • Le plus efficace : du DQL et utiliser des joins pour récupérer les entités associées, ce qui revient à faire du sql mais des objets 
  • Le plus simple : utiliser le FETCH_MODE=EAGER sur une relation de l’entité. Cela récupérera systématiquement l’entité associée. Si vous en avez besoin à chaque fois c’est parfait, sinon vous allez alourdir inutilement la mémoire et le travail de la BDD 

Petite astuce : comme vous le savez, les entités associés non chargées sont initialisées avec un proxy, pour les désérialiser, il faut utiliser la méthode magique __load()  

Les filtres

Ils sont méconnus mais il est possible d’ajouter un filtre à toutes les requêtes en créant une classe et en étendant la classe SQLFilter, définie dans la configuration. Le filtre peut ensuite être activé/désactivé via l’entity manager si besoin. L’exemple le plus frappant : l’utilisation d’une locale. Avec un filtre, plus besoin d’ajouter cette locale à toutes vos requêtes ! 

Exploiter le DQL

On n’y pense pas assez mais le QueryBuilder est un objet et il nous permet de découper nos requêtes en méthode. Par exemple : une méthode pour gérer une condition, une autre pour un select etc. Pour finir on construit notre query en appelant les différentes méthodes. Efficace ! 

Le flush et ses tracking policies

C’est assez méconnu mais le ‘flush’ de Doctrine dispose de plusieurs stratégies appelées « tracking policies ». Par défaut Doctrine utilise le « deferred implicit » : il compare tous les champs de toutes les entités (même celles non persistées !), et génère les requêtes correspondantes. Attention si on manipule beaucoup d’objets, cela peut consommer énormément de mémoire. 

Il existe aussi le « deferred explicit » ou uniquement les entités persistées, les cascades {persist}sont ignoré’s) et « notify » : chaque entité doit signaliser ses modifications à un listener. C’est lourd mais c’est le plus performant. Pour gérer cela, il faut utiliser les lifecycles de doctrine.  

Par contre je suis un peu déçu sur la partie concernant le cache : j’aurais voulu un plus de précision, sur la sérialisation/désérialisation des entités et de leurs associations pour les stocker dans des systèmes tel que Redis, Memcached etc…  

Symfony HTTP Client, on passe à la vitesse supérieure

Le nouveau composant HTTP à l’ambition de remplacer HTTP Foundation et Guzzle, et sachez-le, il a les moyens de vous donner envie de changer. 

Déjà, la syntaxe va faire plaisir à beaucoup de monde, mais ces méthodes de sérialisation/désérialisation également ! Il supporte nativement quelques méthodes d’authentification (ex : bearer)  simplement via un paramètre. 

De l’asynchrone avec PHP

Mais de loin, la plus impressionnante feature est la méthode du stream. Il est possible de traiter la ou les réponses au fur et à mesure qu’elles arrivent, mais aussi de traiter au fur et à mesure le contenu de la réponse ! Avec ce système, on oublie donc une des plus grosses faiblesses de PHP : la gestion asynchrone ! Sur des larges réponses ou de multi-réponses (notamment si la ressource est un fichier), le gain de temps est considérable. 

De la classe et une belle décoration 

Parmi toutes les nouvelles classes, l’HttpBrowser vient remplacer le crawler, NativeHttpClient est la classe la plus bas niveau, utile si vous avez besoin de gérer de manière plus pointilleuse et plus en détail vos requêtes. Des décorateurs sont disponibles, notamment pour générer des mocks et gérer le cache. Tous ses composants viennent remplacer Goutte qui ne sera plus maintenu. C’est normal puisque c’est Fabien Potencier qui le maintenait jusque-là. 

HTTP 3

Rapidement, je passe sur la conférence d’HTTP 3 qui est déjà très bien documenté. 

Abandon du protocole TCP vieillissant pour un nouveau baptisé QUIC (Quick UDP Internet Connections) qui repose sur UDP. Au menu et en gros : fin du couplage avec la connexion réseau, intégration native du chiffrement (et donc une seule requête par connexion), meilleure gestion des paquets, et gestion des paquets par le navigateur. 

La conférence a eu le mérite d’être réaliste sur son implémentation qui va bouleverser pas mal de chose, et cela ne va pas être facile, ni rapide. 

Néanmoins, cette nouvelle version est prometteuse. Il faut juste espérer que la multitude d’acteurs impliqués jouent le jeu. Y compris les FAI, qui vont devoir gérer différemment l’UDP sur leurs box. 

Vous l’aurez sûrement compris en me lisant mais j’ai trouvé ce salon très intéressant. Des développeurs qui s’adressent à d’autres développeurs, cela fonctionne, et je vous recommande d’y participer. L’écosystème Symfony est riche et en pleine évolution, et cela fait plaisir de voir qu’autant de passionnés y contribuent !  

Voir nos offres
Espace Carrière
Ces articles peuvent vous intéresser