PHP Legacy-Modernisierung: Migration, Refactoring und Rewrite-Strategien

Legacy-PHP-Code ist kein Urteil, sondern ein Zustand -- und Zustände lassen sich ändern. Dieser Leitfaden beschreibt, wann PHP-Anwendungen zum Risiko werden, welche Modernisierungsstrategien sich in der Praxis bewährt haben und wie der Übergang von veraltetem Code zu einer wartbaren, sicheren Architektur gelingt.

Wann wird PHP-Code zum Risiko?

Nicht jeder ältere PHP-Code ist automatisch problematisch. Eine Anwendung auf PHP 8.2 mit aktuellen Dependencies und solider Testabdeckung kann jahrelang stabil laufen. Das Risiko entsteht durch eine Kombination konkreter Faktoren:

End-of-Life der PHP-Laufzeitumgebung

PHP 5.6 erreichte sein End-of-Life im Dezember 2018, PHP 7.0 im Dezember 2019, PHP 7.4 im November 2022, PHP 8.0 im November 2023 und PHP 8.1 im Dezember 2025. Anwendungen auf diesen Versionen erhalten keine Sicherheitsupdates mehr. Jede bekannte Schwachstelle bleibt offen — dauerhaft. Für Unternehmen mit Compliance-Anforderungen (ISO 27001, NIS-2, DSGVO) ist der Betrieb auf einer EOL-Version ein dokumentierbarer Verstoss.

Verwaiste Frameworks

Neben der PHP-Version selbst stellt auch das verwendete Framework ein Risiko dar:

Sicherheitsimplikationen

Legacy-PHP-Code weist häufig Schwachstellen auf, die in modernen Frameworks architektonisch ausgeschlossen sind:

Eine Modernisierung ist nicht nur ein technisches, sondern auch ein Risikomanagement-Thema. Ausführlicher behandelt wird das übergreifende Thema im Leitfaden Legacy Software modernisieren aus dem Application-Management-Cluster.

Drei Wege aus der Legacy-Falle

Es gibt kein Patentrezept. Die richtige Strategie hängt von der Ausgangslage ab — Codebasis, Budget, Zeitdruck und verfügbare Kompetenz bestimmen den Weg.

Weg 1: Gezieltes Refactoring

Prinzip: Der bestehende Code wird schrittweise verbessert, ohne die Gesamtarchitektur zu ändern. Kritische Schwachstellen werden behoben, Testabdeckung aufgebaut, Abhängigkeiten aktualisiert.

Wann sinnvoll:

Typische Maßnahmen:

Aufwand: 20-40 % des Aufwands einer Neuentwicklung, verteilt über mehrere Monate.

Weg 2: Strangler Fig Pattern

Prinzip: Neue Funktionalität wird in einer modernen Architektur entwickelt und schrittweise neben das Altsystem gestellt. Über einen definierten Zeitraum übernimmt die neue Anwendung immer mehr Verantwortung, bis das Legacy-System vollständig abgelöst ist.

Wann sinnvoll:

Umsetzung in der Praxis:

  1. Einen Reverse Proxy (nginx, Traefik) vor beide Systeme schalten
  2. Routing-Regeln definieren: Welche URLs auf das alte System zeigen, welche auf das neue
  3. Neue Features ausschließlich im neuen System implementieren
  4. Bestehende Features modulweise migrieren, beginnend mit den geschäftskritischsten
  5. Shared State (Sessions, Datenbank) über APIs oder gemeinsame Datenhaltung synchronisieren
  6. Nach vollständiger Migration das Legacy-System abschalten

Aufwand: 60-80 % einer Neuentwicklung, aber mit deutlich niedrigerem Risiko und ohne Big-Bang-Moment.

Weg 3: Kompletter Rewrite

Prinzip: Die Anwendung wird von Grund auf neu gebaut. Der alte Code dient als funktionale Spezifikation, wird aber nicht übernommen.

Wann sinnvoll:

Risiken:

Aufwand: 100 %+ einer grünen-Wiese-Entwicklung (oft mehr, weil die Migration bestehender Daten und die Parallelität beider Systeme Zusatzaufwand erzeugen).

Migration zu Laravel oder Symfony

Die Frage “Welches Ziel-Framework?” stellt sich bei jeder Migration. Beide Optionen — Laravel und Symfony — haben klare Stärken für Migrationsprojekte. Eine detaillierte Gegenüber-stellung bietet der Framework-Vergleich.

Migration zu Laravel

Gut geeignet für: Anwendungen mit klaren CRUD-Workflows, die von Laravels Conventions profitieren. Projekte, bei denen schnelle sichtbare Fortschritte wichtig sind, um Stakeholder-Vertrauen zu sichern. Teams, die mit Active-Record-ORMs (Eloquent) vertraut sind.

Migrationsstrategie: Laravel bietet mit Eloquent einen Weg, bestehende Datenbankschemas ohne Schema-Änderung zu mappen. Das ermöglicht eine schrittweise Migration: Controllers und Views werden in Laravel neu gebaut, während die bestehende Datenbank unverändertert bleibt. Erst nach vollständiger Migration der Geschäftslogik wird das Schema optimiert.

Details zur Laravel-Entwicklung.

Migration zu Symfony

Gut geeignet für: Anwendungen mit komplexen Domänenmodellen, die von Doctrine ORM und dem Data-Mapper-Pattern profitieren. Projekte mit langer geplanter Lebensdauer (10+ Jahre), bei denen Symfonys LTS-Garantien Planungssicherheit geben. Systeme in regulierten Umgebungen, bei denen architektonische Nachvollziehbarkeit für Audits relevant ist.

Migrationsstrategie: Symfonys Komponentenarchitektur erlaubt eine besonders granulare Migration. Einzelne Symfony-Komponenten (HttpFoundation, Console, DependencyInjection) können in den bestehenden Code integriert werden, noch bevor eine vollständige Framework-Migration stattfindet. Damit lässt sich die Codebasis schrittweise “symfonifizieren”.

Details zur Symfony-Entwicklung.

Datenmigration und Schnittstellenkompatibilität

Die technisch anspruchsvollste Phase jeder Legacy-Modernisierung ist nicht der neue Code — sondern die Migration bestehender Daten und die Aufrechterhaltung externer Schnittstellen.

Datenbank-Schema-Migration

Legacy-Anwendungen haben häufig organisch gewachsene Datenbankschemas: fehlende Fremdschlüssel, gemischte Datentypen, redundante Tabellen, gespeicherte Logik in Stored Procedures. Eine Schema-Migration umfasst:

  1. Bestandsaufnahme: Vollständige Dokumentation des Ist-Schemas inklusive Trigger, Views und Stored Procedures.
  2. Ziel-Schema-Design: Normalisierung, Bereinigung von Redundanzen, Einführung von Foreign Keys und Constraints.
  3. Migrationsskripte: Reversible Migrationsskripte (Laravel Migrations, Doctrine Migrations), die Daten transformieren und validieren.
  4. Integritätsprüfung: Automatisierte Vergleiche zwischen Quell- und Zieldatenbank (Zeilenanzahl, Checksummen, Stichproben).
  5. Fallback-Strategie: Die Möglichkeit, auf den ursprünglichen Zustand zurückzukehren, bis die neue Datenhaltung validiert ist.

API-Kompatibilität

Bestehende Anwendungen stellen häufig Schnittstellen bereit, die von Drittsystemen konsumiert werden: Mobile-Apps, Partner-Integrationen, interne Tools. Diese Schnittstellen müssen während der Migration stabil bleiben.

Bewaherte Strategie: Einen API-Kompatibilitäts-Layer zwischen altem und neuem System einziehen. Das neue System implementiert die gleichen Endpoints mit identischen Request/Response-Strukturen. Erst nach Validierung durch alle Konsumenten werden die alten Endpoints abgeschaltet. Versionierung der API (z. B. /api/v1/ vs. /api/v2/) erlaubt es, neue und alte Schnittstellen parallel zu betreiben.

Weitere Informationen zur API- und Schnittstellenentwicklung finden sich auf der entsprechenden Serviceseite.

Kosten und Zeitrahmen realistisch einschätzen

Legacy-Modernisierung scheitert selten an der Technik — sie scheitert an unrealistischen Erwartungen. Eine ehrliche Einschätzung der Kostenstruktur:

Typische Projektgrößen

StrategieCodebasis 10k LoCCodebasis 50k LoCCodebasis 100k+ LoC
Refactoring80-160 Stunden300-600 Stunden800-1.500 Stunden
Strangler Fig200-400 Stunden600-1.200 Stunden1.500-3.000 Stunden
Rewrite300-500 Stunden800-1.800 Stunden2.000-5.000+ Stunden

Diese Schätzungen umfassen Analyse, Entwicklung, Testing und Deployment. Nicht enthalten: Projektmanagement-Overhead, Stakeholder-Kommunikation und Parallelwartung des Altsystems.

ROI-Betrachtung

Die Investition in eine Modernisierung rechnet sich, wenn die laufenden Wartungskosten des Legacy-Systems die Modernisierungskosten innerhalb von 2-3 Jahren übersteigen würden. Faktoren, die den ROI positiv beeinflussen:

Versteckte Kosten bei Nicht-Modernisierung

Wer die Modernisierung aufschiebt, spart kurzfristig — zahlt aber langfristig:

Legacy-Modernisierung bei TenMedia

TenMedia begleitet seit über 14 Jahren PHP-Migrationsprojekte — von der Analyse bis zum produktiven Betrieb der modernisierten Anwendung. Die ISO-27001-Zertifizierung stellt sicher, dass auch während der Migrationsphase Informationssicherheit und Datenschutz gewährleistet bleiben.

Vorgehen

  1. Legacy Assessment: Analyse der bestehenden Codebasis, Abhängigkeiten, Infrastruktur und Sicherheitslage. Ergebnis: Ein dokumentierter Zustandsbericht mit Handlungsempfehlung (Refactoring, Strangler Fig oder Rewrite).
  2. Strategiedefinition: Gemeinsam mit dem Auftraggeber wird die Migrationsstrategie festgelegt — inklusive Zeitrahmen, Budget und Akzeptanzkriterien.
  3. Iterative Migration: Umsetzung in Sprints mit regelmäßigen Reviews. Jeder Sprint liefert ein funktionsfähiges, testbares Inkrement.
  4. Qualitätssicherung: Automatisierte Tests, Code Reviews und Staging-Deployments sichern jeden Migrationsschritt ab.
  5. Wartungsübergang: Nach erfolgreicher Migration wird die Anwendung in einen regulären Wartungsvertrag überführt.

Das Inhouse-Modell (100 % eigene Entwickler, kein Freelancer-Einsatz, kein Offshoring) stellt sicher, dass Wissen über die migrierte Anwendung nicht nach Projektende verloren geht. Die Berufshaftpflicht sichert zusätzlich gegen Projektrisiken ab.

Für einen übergreifenden Blick auf die PHP-Entwicklung bei TenMedia — inklusive Technologie-Stack, Qualitätssicherung und Referenzen — steht die PHP-Entwicklung Pillar-Seite zur Verfügung.

Weiterführende Informationen