B2B SaaS · Mittelstand
Symfony 2 → 7 Modernization Without a Feature Freeze
Migration of a 700k-line Doctrine 1.x codebase over 14 months with zero production downtime. Incremental strangler-fig approach with continuous feature releases throughout.
- Industry
- B2B SaaS · Mittelstand
- Duration
- 14 months
- Stack
- PHP, Symfony, Doctrine
Results at a glance
- −63% build time
- −41% P95 latency
- Zero production regressions
- Zero production downtime during the migration
Starting situation
A B2B SaaS product from the German Mittelstand ran on Symfony 2 with Doctrine 1.x. The codebase had grown to around 700,000 lines. Symfony 2 and Doctrine 1.x have long been out of support, so the stack no longer received security fixes.
Constraints
- No feature freeze. Feature releases had to continue while the migration ran.
- No production downtime. The system had to stay available for the whole migration.
What was done
Instead of a rewrite, the migration followed the strangler-fig approach: the old application kept serving production while it was moved to the new stack step by step. Because the migration was incremental, feature releases continued throughout the 14 months.
The strangler-fig pattern replaces a legacy system piece by piece. New code takes over one area, traffic for that area moves to it, and the old code for that area is removed once the new path has proven itself. The legacy system shrinks until nothing is left of it. More background on the method:
- The Strangler Fig Pattern: Escaping Legacy Monoliths
- From Symfony 2/3 to Symfony 7: A Multi-Step Migration Strategy
Results
- Build time down by 63%.
- P95 latency down by 41%. P95 is the response time that 95% of requests stay under, so it reflects what the slower requests experience, not just the average.
- Zero production regressions.
- Zero production downtime over the 14 months.
Stack and duration
PHP, Symfony (from version 2 to 7) and Doctrine (from 1.x). The project ran for 14 months.
