Zum Inhalt springen
14. Aug. 2026·8 Min. Lesezeit

Brauchen Classic ASP und PHP denselben Migrationsplan?

Migrationen von Classic ASP und PHP scheitern, wenn Teams eine Hosting-Frist mit einer Architekturentscheidung verwechseln. So planen und prüfen Sie beide.

Brauchen Classic ASP und PHP denselben Migrationsplan?

Classic ASP und ein PHP-Monolith können ähnliche Seiten erzeugen, dieselbe Datenbank abfragen und dasselbe Engineering-Team ärgern. Deshalb sind sie noch lange nicht dieselbe Migration. Classic ASP landet meist auf der Agenda, weil der darunterliegende Windows- und IIS-Stack nur noch schwer zu hosten, zu patchen, personell zu betreuen oder umzuziehen ist. Ein PHP-Monolith kann auf einem unterstützten Stack laufen und trotzdem teuer zu ändern sein, weil seine Grenzen nur in den Köpfen der Entwickler existieren.

Wer beide pauschal als veraltete Webanwendungen behandelt, erstellt einen pauschalen Plan: Seiten erfassen, Framework wählen, Code konvertieren, testen und umschalten. Diese Reihenfolge verdeckt das Risiko, das über das jeweilige Projekt entscheidet. Bei Classic ASP muss das Team zuerst eine auslaufende Laufzeitumgebung samt undokumentierten Abhängigkeiten nachbauen, bevor der aktuelle Host verschwindet. Bei PHP muss es zuerst entscheiden, welche Architekturgrenzen überhaupt sinnvoll sind, denn eine zeilengetreue Neufassung kann alle Ursachen erhalten, die den Monolithen mühsam machen.

Dieser Unterschied bestimmt, was Sie untersuchen, einfrieren, neu entwerfen und als Beleg akzeptieren. Er erklärt auch, warum ein einziges Migrationspaket zum Festpreis selten für beide Systeme passt, selbst wenn die Zeilenzahlen ähnlich aussehen.

Classic ASP bringt eine Plattformfrist mit

Eine Classic ASP-Migration beginnt beim Host, weil die Anwendung zum Teil aus einer IIS-Konfiguration besteht, die zufällig Quelldateien enthält. ASP-Seiten hängen von den Windows-Skriptmodulen, COM-Registrierungen, Einstellungen in der IIS-Metabase oder applicationHost.config, 32-Bit-Kompatibilität, ODBC-Datenquellen, Dateiberechtigungen, Gebietsschema und oft von einem SMTP- oder Aufgabenplaner-Setup ab, das nie in der Versionsverwaltung lag. Wer nur die .asp-Dateien kopiert, besitzt lediglich die sichtbare Schicht.

Die IIS-Dokumentation von Microsoft beschreibt Classic ASP als optionale Webserver-Funktion, die erst durch einen Administrator installiert werden muss. Das klingt banal, trifft aber das Risiko genau: Die Laufzeit ist eine Betriebssystemrolle mit Maschinenzustand und keine Abhängigkeit, die sich aus einem Projektmanifest wiederherstellen lässt. Dieselbe Dokumentation nennt Sicherheitsänderungen wie standardmäßig deaktivierte übergeordnete Pfade in neueren IIS-Konfigurationen. Ich halte die sichereren Vorgaben für richtig, doch ein Migrationsteam muss das alte Verhalten vor jeder Änderung festhalten. Sonst verwechselt es einen Plattformunterschied mit einem Anwendungsfehler.

Die Frist ist selten ein einzelnes Supportdatum eines Anbieters. Sie ist erreicht, wenn die Organisation den Server aus einer Summe von Gründen nicht mehr zuverlässig neu aufbauen kann. Lässt sich eine saubere Maschine nach dokumentierten Anweisungen konfigurieren? Existieren die COM-Installationsprogramme noch? Weiß jemand, welche Identität das Upload-Verzeichnis besitzt? Wird der Datenbanktreiber auf der vorgesehenen Windows-Version unterstützt? Wenn die Antworten schwach ausfallen, besteht die Hosting-Frist bereits, auch wenn der aktuelle Rechner noch antwortet.

Darum beginnt die Bewertung von Classic ASP mit einem Wiederaufbau. Erfassen Sie Site- und Anwendungseinstellungen des IIS, installierte Rollen, Handler-Zuordnungen, Eigenschaften der Anwendungspools, COM-Klassenkennungen, DSNs, Zertifikate, geplante Aufgaben, Windows-Dienste, von der Anwendung gelesene Registrierungseinträge und ACLs aller beschreibbaren Verzeichnisse. Die sinnvolle Inventareinheit ist eine ausführbare Abhängigkeit, nicht eine Seite.

Führen Sie diese Übung unter den Identitäten aus, die die Anwendung tatsächlich nutzt. Ein interaktiv testender Administrator kann einen Registrierungswert lesen, eine Komponente instanziieren und auf eine Freigabe schreiben, die für die Identität des Anwendungspools gesperrt ist. Halten Sie auch die Bitbreite des Prozesses und jeder nativen Komponente fest. Eine 32-Bit-COM-DLL kann sich auf einem 64-Bit-Server erfolgreich registrieren und für den benötigten Worker-Prozess trotzdem unsichtbar bleiben. Im Browser wirken solche Ausfälle wie Anwendungsfehler, auf dem Server wie Hostingfehler. Genau deshalb braucht die nachgebaute Umgebung einen kontrollierten Satz von Anfragen.

Eine funktionierende Startseite ist kein Kompatibilitätsnachweis. Testen Sie Uploads, Berichtsexporte, Passwortwiederherstellung, Tagesabschlussaufgaben, ungewöhnliche Zeichen, große Ergebnismengen und alle Routen, die Dokumente erzeugen oder andere Rechner aufrufen. Alte Websysteme bündeln ihre schwierigsten Abhängigkeiten oft in selten genutzten Verwaltungswegen. Ein oberflächlicher Test berührt sie nicht, und nach der Umschaltung blockieren sie dann die erste Aufgabe in Buchhaltung oder Support.

Ein PHP-Monolith verursacht hohe Änderungskosten

Ein PHP-Monolith braucht eine Architekturentscheidung, wenn fachliche Änderungen zu viel Code durchqueren, nicht bloß weil seine PHP-Version alt aussieht. Unterstütztes PHP, ein aktueller Webserver und wiederholbare Deployments können den Laufzeitdruck beseitigen. Trotzdem kann Checkout-Code Steuerregeln einbinden, können Berichte eigene Datenbankverbindungen erzeugen und kann ein gemeinsames Include die Authentifizierung jeder Route verändern. Das Upgrade des Interpreters ist Wartung. Das Neuzeichnen dieser Grenzen ist Modernisierung.

Teams schlagen oft ein Framework-Upgrade vor, als würde es Architektur erzeugen. Das tut es nicht. Globalen Zustand in einen Container für Abhängigkeiten zu verschieben, kann sauberere Syntax liefern und dieselbe Kopplung erhalten. Eine Active-Record-Bibliothek durch eine andere zu ersetzen, kann die Zuständigkeit für Transaktionen weiter offenlassen. Controller in Services aufzuteilen, kann Ordner schaffen, ohne unabhängig testbares Verhalten zu schaffen. Diese beliebte Empfehlung wirkt attraktiv, weil Werkzeuge einen Teil der Syntaxänderungen automatisieren und der Diff nach Fortschritt aussieht. Sie ist falsch, wenn die Kosten aus Geschäftslogik ohne stabile Zuständigkeit entstehen.

Suchen Sie stattdessen nach den Änderungspfaden. Untersuchen Sie erledigte Arbeit und verfolgen Sie, was Entwickler für eine Preisregel, ein Kundenfeld, eine Berechtigung oder einen Bericht anfassen mussten. Finden Sie Tabellen, die voneinander unabhängige Module beschreiben, Session-Werte als versteckte API, Includes mit Nebenwirkungen und Jobs, die Webcode über einen anderen Einstieg aufrufen. Diese Verbindungen zeigen, wo eine Zielgrenze spätere Änderungskosten senken kann. Eine bloße Dateizahl tut das nicht.

Auch ein PHP-System kann eine Laufzeitfrist haben, besonders wenn es einen nicht mehr unterstützten Interpreter oder aufgegebene Erweiterungen nutzt. Trotzdem werden die beiden Fälle nicht zu einem. Beseitigen Sie das unmittelbare Laufzeitrisiko mit dem kleinsten sicher nachweisbaren Upgrade und entscheiden Sie danach anhand der beobachteten Änderungsmuster über die Architektur. Wer dringende Kompatibilitätsarbeit mit einem breiten Neuentwurf verbindet, kann Fehler schlechter eingrenzen.

Messen Sie Änderungskosten mit Belegen, die die Engineering-Organisation bereits besitzt. Nehmen Sie eine Auswahl abgeschlossener Tickets und ordnen Sie jedem die berührten Dateien, Tabellen, Jobs und Deployment-Einheiten zu. Prüfen Sie Vorfälle, die durch Änderungen in scheinbar unabhängigen Modulen entstanden. Untersuchen Sie, wie lange Reviewer Nebenwirkungen rekonstruieren und wie oft ein Release mehrere Teams koordinieren muss. Sie brauchen keinen künstlichen Kopplungswert. Sie brauchen eine Karte, die erklärt, warum eine kleine Anforderung Authentifizierung, Abrechnung, Reporting und ein gemeinsames Hilfsverzeichnis durchläuft.

Diese Karte verhindert außerdem einen teuren Kategorienfehler: alten Code zu extrahieren statt die Fähigkeit, die sich schlecht ändern lässt. Ein stabiles, hässliches Reporting kann ohne Neuentwurf auskommen. Ein neueres Modul ohne eigene Daten, das durch sechs gemeinsame Services greift, kann zuerst Aufmerksamkeit verdienen. Modernisierung rechtfertigt ihre Kosten durch bessere Bedingungen für künftige Arbeit, nicht dadurch, dass jede Datei zeitgemäß aussieht.

Die Inventare beantworten andere Fragen

Das Classic ASP-Inventar fragt: "Was muss vorhanden sein, damit diese Anfrage exakt wie bisher ausgeführt wird?" Das PHP-Inventar fragt: "Was muss sich gemeinsam ändern und warum?" Beide betrachten Code, Konfiguration, Daten, Traffic und Betrieb, gewichten die Belege aber unterschiedlich.

BelegFrage bei Classic ASPFrage beim PHP-Monolithen
IncludesWelche Datei, welchen virtuellen Pfad und welche Zeichenkodierung löst IIS auf?Welcher gemeinsame Zustand und welche Geschäftsregeln fließen durch den Include-Graphen?
DatenbankzugriffWelcher DSN, Provider, welche Identität und welches Transaktionsverhalten müssen nachgebaut werden?Welches Modul besitzt jeden Schreibvorgang und jede Transaktionsgrenze?
SessionWelcher IIS-Modus, welche Cookie-Einstellung und welche Prozessannahme beeinflussen die Kontinuität?Welche Routen verwenden Session-Zustand als undokumentierte Schnittstelle?
Native AbhängigkeitenWelches COM-Objekt oder welcher Treiber muss vor dem Hostwechsel ersetzt werden?Welche Erweiterung blockiert das Laufzeit-Upgrade, und gehört sie zum Domänenentwurf?
BetriebWelche Windows-Aufgabe, welches Dienstkonto oder beschreibbare Verzeichnis lebt außerhalb der Versionsverwaltung?Welcher Worker, Cron-Eintrag, Queue-Consumer oder CLI-Befehl greift in Webinterna?

Führen Sie diese Daten nicht in einer Tabelle mit Spalten für Dateiname, Sprache und Komplexität zusammen. Dieses Format erzeugt eine falsche Vergleichbarkeit. Ein fünfzeiliger ASP-Aufruf an eine proprietäre COM-Komponente kann den gesamten Zeitplan bestimmen. Ein PHP-Controller mit fünftausend Zeilen kann wortreich, aber mechanisch trennbar sein. Ordnen Sie Classic ASP-Abhängigkeiten nach Risiko beim Wiederaufbau und Ersatz. Ordnen Sie PHP-Bereiche nach Kopplung, Änderungshäufigkeit und fachlicher Zuständigkeit.

Teams verwischen noch einen weiteren Unterschied: Abhängigkeiten zu entdecken ist nicht dasselbe wie Architektur zu entdecken. Die Abhängigkeitsanalyse findet, was das System zur Ausführung braucht. Die Architekturanalyse findet, welche Verantwortlichkeiten sich unabhängig ändern können sollen. Classic ASP verlangt die erste Analyse, bevor sich der Host ändert. PHP-Modernisierung gewinnt ihren größten Nutzen aus der zweiten. Am Ende brauchen beide Projekte beides, aber Reihenfolge und Tiefe unterscheiden sich.

Aufgezeichnetes Verhalten schafft eine gemeinsame Basis

Beide Migrationen brauchen vor jeder Neufassung eine Verhaltensbasis, denn Quellcode ist eine unvollständige Spezifikation. Produktionstraffic zeigt Parameterkombinationen, Cookie-Zustände, Weiterleitungen, Inhaltstypen, Kodierungen, Fehlerantworten und Zeitannahmen, die bei einer Codeprüfung fehlen. Datenbankabbilder, erzeugte Dateien, ausgehende Nachrichten und Jobergebnisse ergänzen die Wirkungen, die HTTP-Antworten nicht zeigen.

Zeichnen Sie repräsentative Anfragen auf, nachdem Sie sensible Werte entfernt oder ersetzt haben. Spielen Sie sie dann in einer kontrollierten Umgebung gegen altes und neues System ab. Vergleichen Sie Status, für Clients relevante Header, normalisierte Antwortkörper, Datenbankänderungen, Dateien und ausgehende Ereignisse. Vergleichen Sie nicht jedes veränderliche Byte. Zeitstempel, Anfragekennungen, vertraglich irrelevante Reihenfolgen und CSRF-Token brauchen explizite Normalisierer. Jeder Normalisierer braucht einen Verantwortlichen und einen Grund, denn eine zu breite Regel kann eine echte Regression löschen.

Ein sinnvoller Paritätsfall ist ein Objekt, das sowohl den Auslöser als auch die erwarteten beobachtbaren Wirkungen enthält:

{
  "case": "invoice-posted-with-credit",
  "request": {
    "method": "POST",
    "path": "/billing/post.asp",
    "form": {"invoice_id": "18421", "apply_credit": "1"}
  },
  "expect": {
    "status": 302,
    "location": "/billing/view.asp?id=18421",
    "database": ["invoice.status=posted", "credit.remaining=0"],
    "outbound": ["invoice-posted email"]
  }
}

Das konkrete Prüfwerkzeug kann anders aussehen, doch seine Ausgabe muss Fall, abweichende Beobachtung, alten Wert und neuen Wert nennen. "Test fehlgeschlagen" reicht bei einer Migration nicht. Ein Entwickler muss erkennen können, ob sich eine Weiterleitung geändert hat, eine Dezimalzahl anders gerundet wurde oder eine E-Mail zweimal versandt wurde.

Bei Classic ASP schützt aufgezeichnetes Verhalten vor Laufzeitunterschieden bei Datumsverarbeitung, Codepages, Variant-Konvertierung und COM-Rückgabewerten. Bei PHP schützt es das Team, während es Logik über neue Grenzen verschiebt. Der Mechanismus ist gleich, der Einsatzgrund ist verschieden.

Abdeckung ist wichtiger als das bloße Anfragevolumen. Erstellen Sie Fälle rund um fachliche Zustände und Übergänge: einen Erstkauf und einen Wiederholungskauf, eine abgelaufene Berechtigung, eine Teilzahlung, einen Benutzer mit zwei Rollen, einen Bericht über eine Zeitumstellung hinweg und einen erneuten Versuch nach einem Timeout eines Folgesystems. Verbinden Sie jeden Fall mit Produktionstraffic, der seine reale Anfrageform belegt. Tausende identische erfolgreiche GET-Anfragen schaffen weniger Vertrauen als eine aufgezeichnete Stornierung mit geprüften Datenbankwirkungen.

Nutzen Sie das alte System nur so lange als Referenz, wie Sie seine Grenzen verstehen. Das alte Ergebnis kann einen Fehler enthalten, von dem Benutzer inzwischen abhängen, oder einen Fehler, den die Migration bewusst beseitigen soll. Kennzeichnen Sie beabsichtigte Unterschiede als geprüfte Entscheidungen mit Verantwortlichem und neuer Erwartung. Verstecken Sie sie nicht in einem Normalisierer. Ein Paritätswerkzeug soll jeden Unterschied sichtbar machen und Menschen die Einordnung überlassen. Es darf das alte System nicht stillschweigend für richtig erklären.

Bei Classic ASP sinkt zuerst das Hostrisiko

Den gemischten Sprachbaum erfassen
Analysieren Sie Webcode, gespeicherte Logik, Jobs und benachbarte Sprachen parallel als eine Migrationsfläche.

Ein sinnvoller Classic ASP-Plan macht das bestehende Verhalten portabel, bevor er den Entwurf verschönert. Die Reihenfolge muss Maschinenzustand früh sichtbar machen und gezielt beseitigen.

  1. Bauen Sie die Anwendung auf einer sauberen, unterstützten Windows- und IIS-Umgebung aus dokumentierter Konfiguration und aufbewahrten Installationsdateien auf. Protokollieren Sie jede manuelle Handlung, die das Quellrepository nicht reproduziert.
  2. Erfassen und wiederholen Sie repräsentatives Produktionsverhalten auf aktuellem und neu aufgebautem Host. Lösen Sie Kompatibilitätsunterschiede, bevor Sie eine neue Anwendungsarchitektur einführen.
  3. Ersetzen oder kapseln Sie Abhängigkeiten, die den Umzug nicht überstehen, angefangen bei COM-Komponenten, alten Datenbankprovidern und lokalem Maschinenspeicher. Geben Sie jedem Ersatz eigene Paritätsfälle.
  4. Schreiben Sie abgegrenztes Verhalten in der Ziellaufzeit neu, während die alte Anwendung als Referenz verfügbar bleibt. Leiten Sie kontrollierten Traffic auf den neuen Pfad und vergleichen Sie die Wirkungen.
  5. Schalten Sie erst um, wenn der Betrieb das neue System ohne Zugriff auf die Ursprungsmaschine bereitstellen, wiederherstellen, beobachten und zurückrollen kann.

Diese Reihenfolge kann zeigen, dass eine vorübergehende IIS-Zwischenstation nötig ist. Das ist vertretbar, wenn sie explizit, reproduzierbar und gepatcht ist und eine klare Ausstiegsbedingung besitzt. Eine undurchsichtige virtuelle Maschine in ein anderes Rechenzentrum zu verschieben und den Erfolg auszurufen, ist keine Modernisierung. Der Zwischenhost kauft Zeit, um Maschinenabhängigkeiten zu beseitigen. Er darf nicht aus Trägheit zum Dauerplan werden.

Entwerfen Sie nicht jeden Ablauf neu, solange Sie nicht erklären können, wie ihn der alte Host ausführt. Weicht eine neu geschriebene Rechnungsseite von der Produktion ab, müssen Sie wissen, ob eine geänderte Geschäftsregel, eine Gebietsschema-Einstellung, das Verhalten eines ADO-Providers oder ein COM-Aufruf die Ursache ist. Wer Umgebungsparität und Entwurfsänderung trennt, verkleinert diesen Suchraum.

Bei PHP entstehen und bewähren sich Grenzen

Ein sinnvoller PHP-Plan beginnt mit einer Zielgrenze, die aus realem Änderungsdruck folgt, und verschiebt Verhalten dann durch diese Naht. Der ursprüngliche Monolith kann auf einem unterstützten Host bleiben, während das Team jeweils eine Domänengrenze beweist. Eine vollständige, abgeschottete Neufassung entfernt das Feedback, das den Entwurf formen sollte.

Wählen Sie Grenzen anhand fachlicher Zuständigkeit und Transaktionsbedarf, nicht anhand von Substantiven aus einer Suche nach Tabellennamen. "Kunde" kommt überall vor und ergibt selten den besten ersten Service. Eine Preisentscheidung, Dokumenterzeugung, Berechtigungsprüfung oder Abrechnung hat oft klarere Ein- und Ausgaben sowie einen eindeutigen Verantwortlichen. Lassen Sie Arbeit, die eine atomare Datenbanktransaktion erfordert, zusammen, bis Sie eine bewusste Konsistenzstrategie haben. Netzwerkaufrufe verbessern keinen Entwurf, nur weil sie eine Prozessgrenze überschreiten.

Die erste Extraktion muss den Architekturmechanismus beweisen: wie Aufrufer sich authentifizieren, wie Verträge sich entwickeln, wer Datenschreibvorgänge besitzt, wie Wiederholungen doppelte Wirkungen vermeiden, wie Fehler sichtbar werden und wie der alte Pfad zurückfällt. Sie braucht auch den Beleg, dass die Grenze den Änderungsumfang senkt. Verlangt jede Funktion weiterhin Änderungen auf beiden Seiten, hat das Team Verteilung ohne Unabhängigkeit geschaffen.

Schreiben Sie keine Microservices vor. Ein modularer Monolith in Go oder TypeScript kann Zuständigkeit und Abhängigkeitsrichtung mit deutlich weniger Betriebsaufwand ausdrücken. Rust kann zu einem numerischen Kern passen, wenn Überlauf, Genauigkeit und Durchsatz genaue Kontrolle verlangen. Für gewöhnliche Anfrageverarbeitung schafft es hingegen eine Sprachgrenze, ohne ein Domänenproblem zu lösen. Die Zielarchitektur soll die gemessene Kopplung entfernen und nicht die bevorzugten Technologien der Organisation ausstellen.

Datenbesitz entscheidet über eine echte Trennung

Eine Migration hat keine Grenze geschaffen, wenn neue Komponente und alte Anwendung dieselben Tabellen nach Belieben aktualisieren dürfen. Gemeinsame Lesezugriffe können vorübergehend als Brücke dienen. Gemeinsame Schreibzugriffe schaffen zwei Regelwerke, zwei Transaktionsmodelle und keinen zuverlässigen Besitzer, wenn Werte abweichen. Dieses Risiko betrifft beide Systeme, steht aber bei der architektonischen PHP-Arbeit im Mittelpunkt, weil die Extraktion zum voreiligen Teilen der Datenbank verleitet.

Benennen Sie zuerst den Schreiber jeder fachlichen Tatsache. Besitzt das neue Preismodul ein berechnetes Angebot, kann der Monolith die Berechnung anfordern und einen unveränderlichen Verweis speichern. Alternativ besitzt das Modul den Angebotsdatensatz und stellt ihn über einen Vertrag bereit. Beides kann funktionieren. Beide Seiten neu rechnen und den Betrag überschreiben zu lassen, kann nicht funktionieren. Halten Sie fest, welche Seite Übergänge validiert, Kennungen vergibt und Wirkungen veröffentlicht.

Classic ASP versteckt Datenverhalten oft in Stored Procedures, Triggern und ADO-Vorgaben. Eine Seitennneufassung mit identischem SQL-Text kann trotzdem Parametertypen, Nullbehandlung, Cursor-Verhalten oder Transaktionsumfang verändern. Prüfen Sie Parität auf Ebene der Datenbankwirkungen, besonders bei Geld, Datumswerten und mehrzeiligen Updates. Eine gleiche HTML-Antwort beweist keinen gleichen Vorgang.

PHP-Monolithen verstecken dasselbe Problem oft hinter einem ORM. Model-Callbacks, Lazy Loads, globale Gültigkeitsbereiche und implizite Transaktionen können aus einem einfachen Methodenaufruf mehrere Wirkungen machen. Erfassen Sie vor dem Verschieben der Methode die Abfragen und den resultierenden Zustand. Entscheiden Sie dann, welche Wirkungen in die neue Grenze gehören. Jeden Callback blind nachzubauen ist Transliteration. Ihn blind zu entfernen ist Datenverlust.

Planen Sie den Übergangszustand und nicht nur das gewünschte Ende. Muss der alte Code Daten lesen, die der neue Baustein besitzt, verwenden Sie vorzugsweise eine explizite Kompatibilitätsansicht, API oder replizierte Leseansicht mit einem Entfernungstermin. Müssen während eines Versuchs beide Pfade denselben Befehl erhalten, bestimmen Sie einen als maßgeblich und vergleichen Sie die vorgeschlagenen Wirkungen des anderen, ohne sie zu speichern. Doppelte Schreibvorgänge aus Anwendungscode wirken im Diagramm leicht. Ein Teilfehler macht daraus jedoch ein Abgleichsystem. Die meisten Teams wollen ein solches System nicht als vorübergehende Migrationsbrücke entwickeln und betreiben.

Schemaänderungen brauchen dieselbe Disziplin. Fügen Sie Felder und Leser hinzu, bevor Sie Schreiber ändern, akzeptieren Sie während des Übergangs alte und neue Darstellungen und entfernen Sie die Kompatibilität erst, wenn der Traffic das Ende des alten Pfads belegt. Datenbank- und Anwendungsdeployment laufen möglicherweise nicht atomar. Ein Plan, der das voraussetzt, trifft irgendwann auf ein Rollback in der falschen Reihenfolge.

Sessions, Jobs und Dateien zeigen die versteckte Anwendung

In weniger als 30 Tagen fertig
CodeHero liefert die vollständige Neufassung samt Verhaltensprüfung in weniger als 30 Tagen.

Der Anfrage- und Antwortpfad ist meist nur ein Teil des Systems. Classic ASP-Anwendungen können InProc-Sessionzustand an einen IIS-Worker binden, erzeugte Dokumente in ein lokales Verzeichnis schreiben, Uploads annehmen, die eine andere Windows-Aufgabe verarbeitet, oder ein COM-Objekt für den Mailversand aufrufen. PHP-Monolithen können Cronjobs haben, die die Webanwendung starten, Queue-Worker mit anderen Umgebungsvariablen, gemeinsame Sessions und Dateien als Koordinationsmechanismus.

Die Session-Migration verlangt eine ausdrückliche Entscheidung. Sie können Cookie und Sessiondarstellung erhalten, Suchvorgänge zwischen alter und neuer Laufzeit überbrücken oder Benutzer bei einer geplanten Umschaltung erneut anmelden lassen. Die richtige Wahl hängt von Sicherheit und Auswirkung auf Benutzer ab. Die Annahme, Sessions würden automatisch weiterlaufen, ist keine Entscheidung. Testen Sie Ablauf, Rotation nach Authentifizierung, gleichzeitige Anfragen, Abmeldung und Deployment-Neustarts.

Jobs brauchen einen eigenen Traffic-Korpus. Erfassen Sie Eingaben, Zeitplanregeln, Sperrverhalten, Datenbankwirkungen, erzeugte Dateien und Wiederholungsverhalten. Ein manuell erfolgreicher Job kann Rechnungen doppelt erzeugen, wenn zwei Scheduler sich überschneiden. Ein Queue-Consumer liefert keine HTTP-Antwort und kann trotzdem die folgenreichste Geschäftslogik der Anwendung enthalten.

Behandeln Sie Dateipfade als Schnittstellen. Ermitteln Sie, wer schreibt und liest, welche Benennungs- und Aufbewahrungsregeln gelten, welche Kodierung und Atomarität erwartet werden und was nach einem unvollständigen Schreibvorgang passiert. Der Wechsel von einem lokalen Windows-Verzeichnis oder gemeinsamen PHP-Host zu Objektspeicher ändert Konsistenz und Berechtigungen. Modellieren Sie diese Änderung, statt nur einen Pfad zu ersetzen und auf korrektes Verhalten aller Verbraucher zu hoffen.

Abnahmekriterien müssen das größte Risiko beweisen

Ein gemeinsames Statusdashboard kann beide Projekte verfolgen, doch die Freigabekriterien dürfen nicht identisch sein. Classic ASP-Kriterien müssen beweisen, dass die Organisation dem alten Host entkommen ist. PHP-Kriterien müssen beweisen, dass der neue Entwurf die Kopplung senkt, ohne Verhalten zu ändern. Konvertierte Dateien oder bestandene Unit-Tests zu zählen, beweist weder das eine noch das andere.

Verlangen Sie bei Classic ASP einen sauberen Umgebungsaufbau aus kontrollierten Artefakten, ein vollständiges Inventar mit Verantwortlichem und Entscheidung für jede externe Abhängigkeit, Paritätsergebnisse für repräsentatives interaktives und stapelweise ausgeführtes Verhalten sowie Betriebsbelege für Deployment, Sicherung, Wiederherstellung, Überwachung und Rollback. Ein Test muss zeigen, dass bei Ausfall des alten Servers kein Installationsprogramm, Geheimnis, Zertifikat und keine Quelle der Wahrheit für den neuen Dienst verschwindet. Abschaltbereitschaft ist eine Abnahmeeigenschaft.

Verlangen Sie bei PHP einen ausdrücklichen Vertrag für jede neue Grenze, genau einen Schreiber für jede verschobene fachliche Tatsache, Parität bei Antworten und Nebenwirkungen, in Code oder Build-Prüfungen erzwungene Abhängigkeitsregeln, Fehler- und Wiederholungstests an Prozessgrenzen und Belege aus abgeschlossenen Änderungen. Arbeit im extrahierten Bereich darf keine Änderungen in unabhängigen Teilen des Monolithen mehr verlangen. Architektonische Unabhängigkeit muss im Änderungspfad sichtbar werden.

Leistungsvergleiche brauchen ebenfalls Kontext. Verwenden Sie Anfrageformen und Parallelität aus der Produktion, wärmen Sie relevante Caches auf und vergleichen Sie neben Latenzen auch Datenbankarbeit. Ein neuer Endpunkt kann schnell antworten und teure Arbeit an eine Queue abgeben, die nicht nachkommt. Ein neu geschriebener Bericht kann mit einer leeren Datenbankkopie schnell wirken und beim Monatsabschluss versagen. Nutzen Sie Last und Datenverteilung des realen Geschäfts.

Definieren Sie auch Fehlerbudgets für die Migrationsmechanik. Wie viele Paritätsabweichungen dürfen offenbleiben? Welche Schwere blockiert Traffic? Wie lange darf eine Queue zurückliegen? Welcher Datenbankabgleich muss null ergeben? Legen Sie fest, wer ein Kriterium aussetzen darf und wie die Entscheidung dokumentiert wird. Ohne diese Regeln verwandelt eine Frist unerklärte Unterschiede durch Besprechungsmüdigkeit in akzeptiertes Risiko. Mit ihnen erkennt die Leitung, ob verbleibende Arbeit harmlose Darstellungsdetails oder unsichere finanzielle Wirkungen betrifft.

Üben Sie das Rollback an derselben Grenze wie den Rollout. Wenn das Routing jeweils eine Fähigkeit verschiebt, muss sie unabhängig zurückkehren können, ohne Schreibvorgänge aus dem neuen Pfad zu verlieren. Bewegt die Umschaltung die ganze Anwendung, messen Sie Wiederherstellung und Datenabgleich mit produktionsnahen Daten. Ein nie ausgeführtes Rollback-Dokument ist eine Hypothese und keine betriebliche Kontrolle.

Eine Schätzung kann beide Unsicherheiten nicht ausdrücken

Übereinstimmung der Neufassung beweisen
Aufgezeichneter Produktionstraffic liefert dem neuen Go-, Rust- oder TypeScript-System eine konkrete Referenz.

Eine Classic ASP-Schätzung muss unbekannte Hostabhängigkeiten, Ersatzentscheidungen und die Menge verfügbarer Verhaltensbelege offenlegen. Eine Schätzung für einen PHP-Monolithen muss Grenzentscheidungen, gemeinsamen Datenbesitz und die Kosten der Aufruferänderung zeigen. Ein Anbieter, der beide anhand von Zeilen- und Seitenzahl bepreist, hat Schreibarbeit und nicht Migrationsrisiko gemessen.

Bitten Sie ein Classic ASP-Team, einen sauberen Wiederaufbau vorzuführen und zu zeigen, wie es Aufrufe außerhalb des Repositorys findet. Fragen Sie nach jedem COM-Objekt, DSN, jeder geplanten Aufgabe, jedem Zertifikat und beschreibbaren Verzeichnis. Fragen Sie, wie es altes und neues Verhalten vergleicht, wenn Variant-Konvertierung oder Gebietsschema ein Ergebnis verändern. Ein Angebot, das mit automatischer Quellkonvertierung beginnt und diese Fragen nicht beantwortet, setzt zu spät im Stack an.

Lassen Sie ein PHP-Team die vorgesehene Besitzgrenze zeichnen und eine kürzlich umgesetzte Funktion hindurchverfolgen. Fragen Sie, welcher Baustein jede Tabelle beschreibt, wie ein Vorgang nach einer Wiederholung idempotent bleibt und welcher Beleg das Team zu einem modularen Monolithen statt zu einem separaten Service bewegen würde. Ein Angebot, das Microservices verspricht, bevor Transaktionen untersucht wurden, hat das Diagramm vor dem System gewählt.

Die Vertragsstruktur muss den Belegen folgen. Discovery braucht konkrete Ergebnisse: Abhängigkeitsregister, Verhaltenskorpus, Grenzkarte, Zielentscheidungen und Abnahmekriterien. Liefermeilensteine müssen beseitigten Risiken oder funktionierendem Verhalten entsprechen, nicht einem Prozentsatz konvertierter Dateien. Feste Termine lassen unbekannte Abhängigkeiten nicht verschwinden. Sie machen frühe Erkundung und enge Entscheidungen wichtiger.

Die Schätzung sollte bekannte Umsetzung und ausdrückliche Optionen trennen. Der Ersatz einer bestimmten COM-Komponente kann einen festen Preis erhalten, nachdem das Team ihre Ein- und Ausgaben beobachtet hat. Die Entscheidung, ob eine PHP-Fähigkeit in Monolith, Modul oder Service gehört, ist eine Architekturoption mit Folgen für Deployment und Datenbesitz. Beides in einem pauschalen Risikozuschlag zu mischen, verbirgt, welche Entscheidung den Aufwand verändern kann.

Verlangen Sie überprüfbare Annahmen. "Standardmäßige ASP-Anwendung" und "typische PHP-Codebasis" sagen nichts. "Keine native Komponente schreibt außerhalb der aufgeführten Verzeichnisse" lässt sich prüfen. "Der Abrechnungsablauf besitzt diese vier Tabellen, und kein anderer Code beschreibt sie" lässt sich prüfen. Eine Schätzung wird glaubwürdiger, wenn das Team sagt, welche Beobachtung sie ändern würde.

Der richtige Plan folgt dem Grund für den Umzug

Nach Classic ASP müssen Sie den alten Windows-Host abschalten können, ohne Verhalten oder eine undokumentierte Betriebsanweisung zu verlieren. Nach einer PHP-Modernisierung müssen Teams eine fachliche Fähigkeit ändern können, ohne gemeinsamen Zustand durch den ganzen Monolithen zu verfolgen. Das sind unterschiedliche Ziellinien.

CodeHero verarbeitet sowohl Classic ASP- als auch PHP-Quellen, liest die gesamte Codebasis mit allen Sprachen zusammen und prüft das neu geschriebene Verhalten mit einem Paritätswerkzeug gegen aufgezeichneten Produktionstraffic. Die Projekte modernisieren die Architektur in Go, Rust, TypeScript und Postgres in weniger als 30 Tagen. Wenn die Umgebung es verlangt, können die von CodeHero bereitgestellten Modelle dafür auch air-gapped auf Hardware innerhalb der Kundengrenze laufen.

Auch wenn Sie ein anderes Team einsetzen, muss dessen Plan das vorherrschende Risiko auf der ersten Seite nennen. Verlangen Sie für Classic ASP den Nachweis, dass der Host rekonstruiert und anschließend entfernt werden kann. Verlangen Sie für PHP eine belastbare Darstellung von Zuständigkeiten, Transaktionen und den Änderungspfaden, die die neue Architektur verkürzt. Beantwortet eine Vorlage beide Fälle, hat sie vermutlich keinen von beiden beantwortet.

FAQ

Wird Classic ASP auf modernem Windows Server noch unterstützt?

Classic ASP bleibt auf passenden Windows Server-Installationen eine optionale IIS-Funktion, doch dadurch wird eine alte Anwendung nicht portabel. COM-Komponenten, Treiber, Konfiguration, Berechtigungen und Skriptannahmen können den Wiederaufbau weiterhin blockieren. Beweisen Sie deshalb die vollständige Umgebung auf einem sauberen Host.

Sollten wir PHP vor dem Neuentwurf des Monolithen aktualisieren?

Läuft die Anwendung auf einer nicht mehr unterstützten PHP-Version, führen Sie zuerst das kleinste sicher testbare Kompatibilitätsupgrade aus. Trennen Sie danach die Architekturarbeit, damit Laufzeitkorrekturen und Grenzänderungen nicht gegenseitig ihre Fehler verdecken.

Kann ein automatischer Konverter Classic ASP in eine moderne Sprache migrieren?

Ein Konverter kann wiederkehrende Syntax bearbeiten, aber fehlenden IIS-Zustand, COM-Verhalten, Datenbesitz oder die beabsichtigte Architektur nicht herleiten. Bewerten Sie ihn nach Paritätsergebnissen und beseitigten Abhängigkeiten, nicht nach dem Anteil ausgegebener Zeilen.

Gilt der Umzug eines PHP-Monolithen in ein Framework als Modernisierung?

Nur wenn der Umzug Zuständigkeiten ändert und den Umfang künftiger Änderungen senkt. Neues Routing, Container und ORM-Syntax können die alte Kopplung unter saubereren Dateinamen erhalten.

Was sollten wir vor einer Classic ASP-Migration inventarisieren?

Erfassen Sie IIS-Rollen und -Einstellungen, Anwendungspools, Handler-Zuordnungen, COM-Registrierungen, DSNs, Treiber, Dienstidentitäten, ACLs, Zertifikate, geplante Aufgaben, beschreibbare Pfade und externe Dienste. Ordnen Sie jedem Eintrag einen Verantwortlichen, eine Ersatzentscheidung und einen Test zu.

Wie wählen wir die erste Grenze in einem PHP-Monolithen?

Nutzen Sie echte Änderungshistorie, Transaktionsgrenzen und fachliche Zuständigkeit. Wählen Sie Verhalten mit klarer Ein- und Ausgabe sowie einem Verantwortlichen. Prüfen Sie dann, ob spätere Änderungen unabhängige Teile des Monolithen nicht mehr durchqueren.

Wie testen wir eine Neufassung bei schlechter Legacy-Dokumentation?

Zeichnen Sie repräsentative Produktionsanfragen und beobachtbare Wirkungen auf, entfernen Sie sensible Werte und spielen Sie die Fälle gegen altes und neues System ab. Vergleichen Sie Antworten, Datenbankzustand, Dateien und ausgehende Ereignisse mit engen, dokumentierten Normalisierern.

Sollte die Zielarchitektur Microservices verwenden?

Nicht automatisch. Ein modularer Monolith schafft oft klare Zuständigkeit mit weniger Betriebsaufwand. Trennen Sie einen Service nur, wenn unabhängiges Deployment, Skalierung, Fehlerisolierung oder Besitz die zusätzliche Netzwerk- und Konsistenzarbeit rechtfertigen.

Was ist das größte Umschaltrisiko bei Classic ASP?

Die versteckte Abhängigkeit von der ursprünglichen Maschine ist meist schlimmer als der sichtbare ASP-Code. Eine Umschaltung ist erst abgeschlossen, wenn der Betrieb den Ersatz bereitstellen, wiederherstellen und ausführen kann, ohne etwas von diesem Host abzurufen.

Können Classic ASP- und PHP-Migrationen Arbeit teilen?

Ja. Beide profitieren von aufgezeichnetem Verhalten, Paritätstests, ausdrücklichen Datenwirkungen und Betriebsproben. Sie sollten diese Prüfmethoden gemeinsam nutzen, aber Inventarprioritäten, Reihenfolge und Abnahmekriterien getrennt halten.