Aller au contenu principal
Articles

Blog — Architecture web, Symfony et DevOps

Retrouvez mes réflexions sur l'ingénierie logicielle, les meilleures pratiques et l'actualité tech.

Une application unique sert plusieurs clients dont les données restent cloisonnées chacune dans leur propre espace
Architecture Stratégie 15 min

Application multi-tenant : quel modèle d'isolation ?

Concevoir une application SaaS impose tôt une décision structurante : comment isoler les données de chaque client. Cet article compare les quatre modèles multi-tenant, du plus mutualisé au plus cloisonné — base partagée avec discriminant tenant_id, schéma par client, base par client (silo) et instance par client. Pour chacun, les vrais arbitrages : cloisonnement et risque de fuite, RGPD, coût d'infrastructure et de migrations, noisy neighbor, personnalisation et passage à l'échelle. Avec une grille de décision, le côté concret côté Symfony (résolution du tenant par le host, filtre Doctrine en pooled, bascule de connexion DBAL en silo), un rappel que l'isolation ne s'arrête pas à la base mais s'étend aux fichiers et au stockage objet, au cache, à la recherche et aux files de messages, trois cas terrain anonymisés positionnés sur l'axe d'isolation, et un parti pris assumé : l'isolation par construction dès que les données sont sensibles.

Un cache distribué protège une application des lenteurs et des pannes d'une API externe
Développement Architecture 12 min

Mettre une API externe en cache sans servir de données périmées

Beaucoup d'applications dépendent d'une API qu'elles ne maîtrisent pas — un annuaire, un référentiel, un ticketing maison — lente et parfois indisponible. Le réflexe est de mettre un cache devant ; le piège est de cacher sans discernement et de servir des tickets fermés comme ouverts. Ce retour d'expérience montre que cacher une API externe n'est pas un problème de cache mais de classification : trier chaque donnée entre ce qui peut vieillir (l'annuaire) et ce qui doit rester vivant (les tickets). Avec, autour de cette décision, une façade qui centralise les appels — une couche anti-corruption —, une clé de cache normalisée par tri avant hachage, une dégradation gracieuse qui renvoie une valeur neutre quand l'API tombe, et une interface qui rend toute la chaîne testable hors-ligne.

Un transport sur mesure relie Symfony Mailer à une API d'emails d'entreprise authentifiée et chiffrée
Développement Architecture 12 min

Un transport Symfony Mailer sur mesure pour une API d'emails interne

En grande entreprise, le SMTP direct est fermé : tous les emails passent par une API maison, authentifiée en OAuth2 et capable de signer ou chiffrer en S/MIME. Le réflexe est d'écrire un service qui appelle cette API partout — et de coupler cinquante endroits du code à une plomberie spécifique, en perdant au passage l'objet Email, les templates Twig et la file d'attente. Ce retour d'expérience montre le bon point d'extension : un transport Symfony Mailer derrière un DSN api://, qui traduit l'Email en payload, met son token OAuth2 en cache avec une marge et un retry sur 401, et reçoit ses options de signature par des en-têtes MIME consommés en chemin. Une centaine de lignes isolées dans la librairie partagée, et tout le code métier ignore que l'API existe.

Un moteur de formules transforme des expressions métier en calculs exécutés en toute sécurité par une application web
Développement Architecture 12 min

Un moteur de formules métier sans Excel ni eval()

« Il nous faudrait juste des formules, comme dans Excel. » Cette demande mène soit à eval() et ses failles, soit à un parseur maison ingérable — soit à Symfony ExpressionLanguage, un composant discret qui fait exactement ce travail. Ce retour d'expérience croise deux mises en production très différentes : une application de reporting d'un grand opérateur télécom qui a remplacé un classeur Excel — fonctions null-safe à la sémantique tableur, solveur itératif de vingt lignes qui converge sans graphe de dépendances — et une plateforme SaaS PIM où les utilisateurs écrivent eux-mêmes leurs règles — vocabulaire métier de soixante fonctions, validation à la saisie, cache d'AST partagé et dépendances déduites de l'arbre syntaxique. Avec, en fil rouge, la frontière que ce montage offre au métier : changer ses règles sans déploiement.

Une librairie de composants partagée alimente plusieurs applications indépendantes sans les attacher entre elles
Architecture Stratégie 13 min

Partager du code entre cinq applications sans les coupler

Copier-coller les mêmes utilitaires entre projets fait diverger le code ; la librairie commune mal conçue couple tout ce qu'elle touche. Entre ces deux échecs, il existe une voie étroite et documentée. Ce retour d'expérience décortique une librairie PHP interne partagée entre cinq applications Symfony d'un grand opérateur télécom : trois ans de vie, vingt-sept versions, un seul changement cassant dans l'API du quotidien. Au programme, les quatre décisions qui rendent la mutualisation rentable — soft dependencies pour ne payer que ce qu'on consomme, bridges interface + fake déterministe, rétrocompatibilité additive par défaut et changelog qui remplace les réunions — ainsi que les critères, tout aussi importants, pour savoir ce qu'il ne faut pas mutualiser.

Un processeur bridé par un quota ralentit une application conteneurisée malgré des ressources disponibles
Infrastructure 12 min

Dimensionner PHP-FPM sur Kubernetes : le throttling invisible

L'application est lente, les dashboards sont verts et le CPU semble à peine utilisé : c'est la signature du CPU throttling, un phénomène que les graphes de supervision standard ne montrent jamais. Sur une application Symfony déployée sur OpenShift pour un grand opérateur télécom, une seule commande — lire cpu.stat dans le cgroup du pod — a révélé 89 % de fenêtres CPU throttlées et 16 secondes d'attente pour chaque seconde de calcul. Cet article déroule le diagnostic et la correction complète : la limite CPU et le pool PHP-FPM qui se masquaient mutuellement, l'équation mémoire des workers, l'OPcache qui évinçait en boucle et le mpm_prefork imposé en douce par un paquet Debian. Résultat mesuré : 0 % de throttling, sans ajouter un seul nœud au cluster.

Un déploiement progressif bascule le trafic vers la nouvelle version d'une application sans interruption de service
Infrastructure 14 min

Déployer en journée sans couper le service

Un déploiement qui exige une coupure de service est un déploiement qu'on repousse — donc rare, donc gros, donc risqué. Sur une application Symfony déployée sur OpenShift pour un grand opérateur télécom, la mise en production se fait désormais en pleine journée, sans aucune interruption, grâce à un rolling update orchestré par GitLab CI et to-be-continuous. Cet article détaille les quatre ingrédients du zero-downtime — replicas, stratégie de bascule, probes honnêtes, attente vérifiée du rollout — et les pièges qui n'apparaissent que lorsque deux versions cohabitent : migrations additives, sessions dans Redis, workers Messenger et CronJobs suspendus. Avec, en bonus, un arbitrage honnête face au blue/green.

Un pipeline d'intégration continue valide un container Docker avant son déploiement en production
Infrastructure Développement 15 min

Tester l'image Docker de prod avec des e2e en CI

Le container déployé en production n'est jamais exactement le code testé en CI : dépendances sans dev, build des assets, configuration serveur, entrypoint… Sur une application Symfony déployée sur OpenShift pour un grand opérateur télécom, la suite e2e Playwright s'exécute désormais directement contre l'image de production fraîchement construite, comme service GitLab CI, avant toute publication. Cet article détaille l'architecture complète — bundles dev-only pour rendre l'image démarrable en test, dump SQL versionné pour des données déterministes, Mailpit pour les emails — et les pièges concrets rencontrés, dont un TLD préchargé HSTS dans Chromium.

Logo officiel du Forum PHP Paris 2026 sponsorisé par x10
Stratégie Méthodologie 5 min

x10, sponsor Chocolat du Forum PHP 2026

Les 8 et 9 octobre 2026, x10 sera de nouveau sponsor Chocolat du Forum PHP, organisé par l'AFUP à l'Hôtel New York — The Art of Marvel à Disneyland Paris. Après l'édition 2025, ce sponsoring reconduit s'inscrit dans presque 13 ans d'adhésion à l'association et traduit un engagement dans la durée : veille technologique de premier plan, ancrage dans l'écosystème PHP/Symfony et réseau de confiance mobilisable au service des clients.

Un développeur freelance travaille sur un projet technique de longue durée
Méthodologie Stratégie 12 min

Plus de 10 ans de prestation freelance pour Orange

Août 2015, premier commit. Avril 2026, toujours en mission. Plus de 10 ans de prestation freelance continue pour la direction technique d'Orange : 5 projets, des migrations Symfony 2 à 6.4, un passage sur OpenShift, une image Docker maison et une librairie PHP partagée. Cet article est un retour d'expérience sur ce qui fait durer une relation freelance/grand compte sur la durée : confiance mutuelle, autonomie, résultats constants et zéro raccourci technique.

Balance comparant un PIM standard et un PIM sur mesure
Stratégie Architecture 13 min

Akeneo vs PIM sur mesure : les limites du standard

Akeneo est le PIM open source de référence, mais il ne couvre pas tous les besoins. En tant que CTO d'un PIM sur mesure intégrant PIM, DAM, CMS et Hub, je compare les deux approches sur des critères concrets : flexibilité du modèle de données, intégration multi-canal, coût total sur 5 ans, dépendance éditeur et écosystème. L'article propose aussi l'approche hybride qui fonctionne le plus souvent : Akeneo pour le cœur PIM, du sur mesure pour les 20 % restants.

Trois écrans affichent les interfaces WooCommerce, PrestaShop et Magento côte à côte
Stratégie Développement 12 min

WooCommerce, PrestaShop ou Magento : lequel choisir

WooCommerce, PrestaShop, Magento : trois plateformes e-commerce open source qui couvrent des besoins très différents. Cet article n'est pas un comparatif de fonctionnalités mais un avis de terrain, forgé en construisant des connecteurs PIM vers chacune de ces plateformes. Taille de catalogue, coûts d'hébergement, qualité des API, complexité de développement et écosystème français : les critères concrets pour un choix éclairé.

edit_note

Un sujet vous intéresse ?

Vous avez une question technique ou souhaitez approfondir un sujet abordé dans ces articles ? N'hésitez pas à me contacter pour en discuter.

Me contacter arrow_forward