Un développeur travaillant sur Teradion, un logiciel de gestion de cabinet pour les experts-comptables français, a migré une application Symfony de nginx plus PHP-FPM vers FrankenPHP en mode worker. Le résultat, rapporté de mémoire sans benchmark formel : environ 20 % d'amélioration, loin des 3,5x promus sur la page d'accueil de FrankenPHP. L'application passe l'essentiel de son temps à extraire déclarations et échéances de six systèmes externes.
En cherchant l'origine du chiffre de 3,5x, l'auteur n'a trouvé aucune méthodologie publiée. Les benchmarks du dépôt de démonstration datent d'octobre 2022, mesurent la latence à faible charge avec un sleep dans le script, ne donnent aucun chiffre de RPS, et montrent même le mode classique plus lent que FPM. L'issue GitHub #481 demandant des benchmarks reproductibles est ouverte depuis janvier 2024.
Une comparaison Tideways de septembre 2025 a recadré les attentes : avec une méthodologie publiée (Hetzner CCX33, Vegeta), elle n'a trouvé pratiquement aucune différence de performance ou de débit entre PHP-FPM et FrankenPHP en mode classique. Conclusion de l'auteur : le gain vient du mode worker qui ne redémarre pas l'application à chaque requête, pas du serveur lui-même. Remplacer nginx par Caddy en restant en mode classique ne sert à rien.
Plusieurs pièges ont coûté du temps. Après la migration, de nombreux fichiers se sont retrouvés en 0600 — dont la clé privée JWT — provoquant des erreurs 500 au login sans rien dans les logs. Une variable d'environnement runtime dans systemd exigeait des antislashs doublés dans les directives Environment ; les antislashs simples sont rejetés, et via EnvironmentFile ils sont supprimés, contrairement à ce qu'indique la documentation officielle. Le worker refusait de démarrer.
Le problème le plus pénible fut l'état persistant entre requêtes : un filtre restait actif d'une requête à l'autre et cassait les logins de façon intermittente. C'est un comportement documenté — FrankenPHP indique que l'état statique persiste par conception et que $_ENV n'est pas réinitialisé ; Symfony avertit que l'état capturé par le kernel ou ses services peut fuiter si les services n'implémentent pas ResetInterface. Le débogage a été rallongé par PrivateTmp, qui masquait les logs écrits dans /tmp, et par la compilation de getSubscribedEvents : un redémarrage ne suffit pas, il faut vider le cache.
Malgré un gain de vitesse modeste, l'auteur estime la migration bénéfique pour la simplicité opérationnelle : un binaire et une configuration au lieu de nginx plus php-fpm, et plus de gestion des certificats. L'article Tideways mentionne aussi cette réduction de complexité. L'auteur n'a trouvé aucune étude de cas publique avec des chiffres de production réels et invite la communauté à partager les siens.
Commentaires
Pas encore de commentaire — écris le premier.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
Rien reçu ? Vérifiez le dossier spam — et marquez le message « Non spam » pour qu'il arrive directement la prochaine fois.