jeudi 9 juin 2016

Passer de Symfony 2.8 à Symfony 3.1

Etant sur un projet qui a débuté en Symfony 2.6, j'ai du effectuer les migrations vers la 2.7, puis la 2.8.
Concrètement, à part un problème en 2.8.5 sur le NumberType qui retournait un int ou un float, et qui s'est mit à retourner uniquement des float (même si on a saisi 1 par exemple, voir le commit), tout s'est bien passé.

Par contre, et même en faisant très attention à ne pas trop avoir de deprecated dans notre code, et sachant que Symfony 2.8 lui-même générait des centaines de deprecated, le passage à la 3.1 ne s'est pas fait sans mal ... Déjà à cause des bundles utilisés. Il a fallu attendre quelques mois pour que les dépendances fonctionnent (FOSUserBundle par exemple), et certaines ne seront jamais mis à jour (knplabs/doctrine-behaviors).
Voici une liste de ce qui m'a posé soucis, et comment je l'ai corrigé :
  • $validator->validate($value, $constraints = null, $groups = null) : l'ordre des paramètre a changé. Avant, on pouvait passer $groups en 2ème, ou en 3ème, au choix. Depuis la 3.0, $groups est forcément le 3ème paramètre.
  • Knp\DoctrineBehaviors\ORM\Blameable\UserCallable utilisait security.context, qui n'existe plus, au profit de security.token_storage. Comme KNP s'occupe très peu de la migration vers Symfony 3, j'ai du changer la configuration knp.doctrine_behaviors.blameable_subscriber.user_callable.class, pour la faire pointer sur une classe de mon projet, qui utilise le nouveau service.
  • ContainerInterface::isScopeActive() n'existe plus, il a donc fallu faire sans
  • Dans les fichiers YML, il restait quelques chaines sans quotes, qui contenaient des ":". Depuis Symfony 3, le composant YML lève une exception de parsing dans ce cas-là.
  • Quelques configurations de FormType qui n'existent plus, comme pattern, precision, property, etc. Voir la liste ici.
  • Comme l'option choices_as_values n'existe plus, il a fallu repasser sur tous les CollectionType : pour les valeurs du sous-formulaire, avant on passait en clef la valeur à stocker, et en valeur, le libellé à afficher. Maintenant, c'est l'inverse.
  • {% render() %} n'aurait pas du être appelé comme ça, mais plutôt {{ render() }}. C'est obligatoire maintenant.
  • La configuration twig.form.resources devient twig.form_themes
  • La configuration security.firewalls.foo.form_login.csrf_provider: form.csrf_provider devient security.firewalls.foo.form_login.csrf_token_generator: security.csrf.token_manager

Benchmarks entre Symfony 2.8.4 et Symfony 3.1.0


Il faut bien prendre en compte que ces benchmarks sont à tire informatif. Ils ont été fait sur mon PC, donc avec une interface graphique très gourmande, avec Apache Bench, PHP 5.6, sur la page de connexion de mon projet.
Pour chacune des concurrences d'accès, 1 000 appels sont effectués. Le temps affiché est le temps moyen d'une requête. L'environnement est spécifié à côté de la version de Symfony.

Concurrence 1 Concurrence 3 Concurrence 5 Concurrence 10
Symfony 2.8.4
(prod)
81.329 ms
(12.30 req/s)
97.185 ms
(30.87 req/s)
114.103 ms
(43.82 req/s)
218.755 ms
(45.71 req/s)
Symfony 3.1.0
(prod)
113.321 ms
(8.82 req/s)
138.314 ms
(21.69 req/s)
152.142 ms
(32.86 req/s)
299.432 ms
(33.40 req/s)
Symfony 2.8.4
(dev)
230.995 ms 287.655 ms 342.507 ms 672.107 ms
Symfony 3.1.0
(dev)
243.499 ms 301.299 ms 358.609 ms 692.711 ms

On constate donc que l'environnement de prod est environ 3x plus rapide que l'environnement de dev.
Symfony 3.1 est 28% plus lent que Symfony 2.8.4 !

2 commentaires:

  1. meilleur score : 81 ms ... arrête vite Symfony :p

    RépondreSupprimer
  2. Tout le monde sait que si tu veux de la perf, tu dégages Symfony, Doctrine et PHP ;)

    Mais je suis sûr qu'il y a moyen de faire largement mieux avec un serveur, et pas un PC de codeur

    RépondreSupprimer