Eine Deployment-Strategie mit Rollback in PHP besteht nicht darin, eine Schaltfläche vorzuhalten, um zur vorherigen Version zurückzukehren. Sie ist ein operatives Konzept, das es ermöglicht, Code zurückzunehmen, ohne inkompatible Daten, duplizierte asynchrone Jobs oder laufende Prozesse zu hinterlassen, die bereits verworfene Regeln ausführen. Das Rollback muss eine vor der Veröffentlichung vorbereitete Option sein, keine improvisierte Reaktion während eines Incidents.
Kleine Deployments verringern den Wirkungsradius: Sie führen weniger Variablen ein, erleichtern die Identifizierung der verursachenden Änderung und verkürzen die Wiederherstellung. Dennoch kann eine kleine Änderung Zahlungen, Authentifizierung, Berechtigungen, Inventar oder Kommunikation betreffen. Deshalb ersetzt die Größe der Änderung weder technische Kontrollen noch explizite Kriterien zum Anhalten einer Veröffentlichung.
Das Rollback wird entworfen, bevor ein Incident auftritt

Code zurückzusetzen ist nur dann einfach, wenn die Änderung keinen gemeinsam genutzten Zustand verändert hat. In der Produktion kann eine Version Daten geschrieben, Nachrichten an eine Queue gesendet, eine geplante Aufgabe aktiviert oder einen externen Dienst aufgerufen haben. Zu einem früheren Commit zurückzukehren, ohne diese Auswirkungen zu prüfen, kann den ursprünglichen Fehler verschleiern und einen schwerer zu diagnostizierenden Fehler erzeugen.
Vor der Freigabe eines Deployments muss das Team vier Fragen beantworten können:
- Welches Artefakt bereitgestellt wird: eine identifizierbare Version, einmal gebaut und für die Wiederherstellung verfügbar.
- Welcher Zustand sich ändert: Datenbankschema, Cache, Dateien, Suchindizes, Queues, externe Anbieter und Konfiguration.
- Welche Version diesen Zustand lesen und schreiben kann: neuer Code, vorheriger Code oder beide während eines Zeitfensters.
- Welches Signal zum Handeln zwingt: Fehlerschwelle, Ausfall eines kritischen Ablaufs, Queue-Verzögerung, Latenzverschlechterung oder bestätigte funktionale Auswirkung.
Die Einheit der Rücknahme muss definiert sein. Sie kann die gesamte Anwendung, einen Dienst, einen Queue-Consumer oder eine per Konfiguration aktivierte Funktionalität umfassen. Es ist nicht sinnvoll, Einsatz, das Software installiert, mit Freigeben zu verwechseln, das ein Verhalten verfügbar macht. Ihre Trennung ermöglicht es, inaktiven Code bereitzustellen und ihn erst nach der Validierung technischer Bedingungen freizugeben.
Änderungen nach ihrer Fähigkeit zur Rücknahme klassifizieren
Nicht alle Änderungen erlauben dieselbe Behandlung. Eine Anpassung der Darstellung oder eine interne Korrektur ohne Zustandsänderungen ist normalerweise durch die Wiederherstellung des vorherigen Artefakts reversibel. Dagegen erfordern eine destruktive Migration, eine Änderung eines API-Vertrags oder eine neue Geschäftsregel, die bereits externe Auswirkungen erzeugt hat, eine zusätzliche Strategie.
Normalerweise reversible Änderungen
- Logikkorrekturen, die Eingabe- und Ausgabeverträge beibehalten.
- Änderungen an Templates, sofern sie nicht von entfernten Feldern abhängen.
- Neue Routen oder Endpoints, die bestehende Ressourcen nicht verändern.
- Interne Optimierungen ohne Änderungen am Schema oder an der Semantik.
Änderungen, die vorübergehende Kompatibilität erfordern
- Umbenennung oder Ersetzung von Spalten, JSON-Feldern und Events.
- Formatänderungen bei Queue-Nachrichten oder Webhooks.
- Neue Validierungsbeschränkungen für bereits vorhandene Daten.
- Änderungen an Authentifizierung, Berechtigungen oder Berechnungsregeln.
- Integrationen, die Gebühren, Bestellungen, Benachrichtigungen oder Änderungen in externen Systemen erzeugen.
Für gemeinsam genutzte Daten ist das sicherste Muster meist erweitern, migrieren, reduzieren. Zuerst wird eine kompatible Struktur ergänzt, danach unterstützt der Code vorübergehend das alte und das neue Format, die erforderlichen Daten werden migriert oder aufgefüllt, und erst nachdem die alte Version endgültig entfernt wurde, wird Veraltetes gelöscht. Beispielsweise ist das Hinzufügen einer nullable-Spalte und das Schreiben beider Felder während eines Übergangs wiederherstellbar; eine von der vorherigen Version verwendete Spalte direkt umzubenennen oder zu löschen, ist es nicht.
Migrationen müssen als vom Code unabhängige Liefergegenstände behandelt werden. Eine reine Vorwärtsmigration kann korrekt sein, doch dann muss der Plan erklären, dass ein Anwendungs-Rollback nicht die Rücknahme des Schemas einschließt. Vermeiden Sie eine automatische Down-Migration, wenn sie nach der Änderung erzeugte Daten löschen kann oder ihr Ergebnis vom tatsächlichen Produktionszustand abhängt.
Artefakte, Konfiguration und Voraussetzungen vorbereiten
Dasselbe Artefakt muss zwischen Umgebungen weitergegeben werden. Abhängigkeiten zu kompilieren oder Code direkt auf jedem Server zu ändern, macht es unmöglich festzustellen, welche Version ausgeführt wird, und erschwert die Wiederherstellung einer bekannten Version. In einer PHP-Anwendung kann das Artefakt den versionierten Code und die aufgelösten Abhängigkeiten enthalten; sensible und umgebungsspezifische Konfiguration muss über externe Mechanismen injiziert werden und darf nicht im Paket eingebettet sein.
Protokollieren Sie mindestens die Versionskennung, das Veröffentlichungsdatum, die relevante funktionale Konfiguration und die für die Entscheidung verantwortliche Person. Das beschleunigt sowohl die Untersuchung als auch die Rückkehr zu einer bestimmten Version.
Prüfen Sie vor dem Deployment automatisiert und sichtbar:
- Unit-, Integrations- und Vertragstests, die der Änderung angemessen sind.
- Abhängigkeitsauflösung und Kompatibilität mit der erforderlichen PHP-Version, Erweiterungen und Diensten.
- Migrationsstatus, Plan zur Datenerweiterung und geschätzte Ausführungszeit.
- Zustand der Abhängigkeiten: Datenbank, Cache, Speicher, interne APIs und kritische Anbieter.
- Kapazität und Verhalten von Workern, Queues und geplanten Aufgaben.
- Verfügbarkeit des vorherigen Artefakts und ein getestetes Verfahren zu dessen Wiederherstellung.
Die Prüfungen dürfen sich nicht darauf beschränken, dass der PHP-Prozess antwortet. Ein Health-Endpoint kann bestätigen, dass PHP-FPM aktiv ist, und dennoch einen Autorisierungsfehler, eine langsame Abfrage oder einen blockierten Consumer nicht erkennen. Definieren Sie kleine synthetische Abläufe, die kritische Vorgänge darstellen, ohne irreversible Aktionen auszuführen.
Schrittweise veröffentlichen – mit klaren Verantwortlichkeiten und Grenzen
Die schrittweise Freigabe verringert den Umfang eines Fehlers, funktioniert jedoch nur, wenn sich Traffic oder Instanzen tatsächlich trennen lassen. Ein Teil der Instanzen kann aktualisiert, eine Funktionalität für ein kontrolliertes Segment aktiviert oder ein Teil der Anfragen auf die neue Version geleitet werden. Die Wahl hängt von der Architektur und der Art des gemeinsam genutzten Zustands ab.
Weisen Sie während des Veröffentlichungsfensters explizite Rollen zu:
- Eine Person führt die Schritte aus und protokolliert sie.
- Eine andere beobachtet relevante Metriken, Logs und Traces.
- Eine verantwortliche Person ist befugt, ohne auf unklare Genehmigungen zu warten anzuhalten oder zurückzusetzen.
- Das Business- oder Support-Team kennt die erwarteten Auswirkungen, falls die Änderung einen sensiblen Vorgang betrifft.
Legen Sie außerdem ein Beobachtungsfenster fest. Es reicht nicht aus, zu veröffentlichen, eine korrekte HTTP-Antwort zu sehen und mit der nächsten Änderung fortzufahren. Einige Fehler treten erst auf, wenn eine Queue verarbeitet wird, ein Cache abläuft, eine geplante Aufgabe ausgeführt wird oder ein Benutzer einen längeren Ablauf abschließt.
Danach prüfen: Dienst, Daten und geschäftliche Auswirkungen
Die nachträgliche Überprüfung muss technische und funktionale Signale kombinieren. Allgemeine Metriken sind nützlich, aber ein stabiler Latenzdurchschnitt kann den Ausfall eines seltenen und kritischen Vorgangs verdecken.
- Kritische Abläufe: Authentifizierung, zentrales Lesen und Schreiben, Zahlungen, Bestellerstellung oder Aktionen mit Berechtigungen.
- Fehler: PHP-Exceptions, 5xx-Antworten, unerwartete Zunahmen von 4xx, Validierungsfehler und Ausfälle von Abhängigkeiten.
- Leistung: Latenz pro Endpoint, Worker-Auslastung, Datenbankverbindungen und Ressourcenverbrauch.
- Asynchrone Verarbeitung: Größe und Alter der Queue, Wiederholungen, fehlgeschlagene Nachrichten und Idempotenz.
- Geschäftliche Auswirkungen: unvollständige Transaktionen, Duplikate, ungültige Statusänderungen oder Rückgänge bei Conversions, die das Team abgleichen kann.
Die Entscheidungskriterien müssen überprüfbar sein. Setzen Sie fort, wenn die definierten Abläufe funktionieren, kein anhaltender Fehleranstieg vorliegt und die Queues innerhalb ihrer akzeptablen Verzögerung bleiben. Halten Sie die Ausweitung an, wenn eine Anomalie auftritt, die noch eine Diagnose erfordert. Setzen Sie zurück, wenn das vorherige Artefakt mit dem aktuellen Zustand kompatibel ist und die Wiederherstellung die Auswirkungen eindeutig reduziert. Korrigieren Sie vorwärts, wenn ein Zurücksetzen die Kompatibilität brechen würde, externe Auswirkungen nicht rückgängig machen würde oder länger dauern würde als die Anwendung einer isolierten und validierten Korrektur.
Queues und von einer zurückgenommenen Version gestartete Prozesse verwalten
Worker sind eine häufige Ursache unvollständiger Rollbacks. Der Webcode kann zurückgenommen werden, während noch von der neuen Version erzeugte Nachrichten oder langlebige Prozesse vorhanden sind, die weiterhin alte Logik ausführen. Der Plan muss festlegen, wie Consumer ohne Verlust der Nachvollziehbarkeit geleert, pausiert, neu gestartet oder isoliert werden.
Betrachten Sie einen hypothetischen Ablauf: Eine PHP-Anwendung veröffentlicht eine Nachricht, um eine Bestellung zu bestätigen. Die neue Version fügt der Nachricht ein Feld hinzu und ändert den Status der Bestellung vor dem Senden. Muss sie zurückgenommen werden, muss der vorherige Consumer das zusätzliche Feld sicher ignorieren können, oder die Nachricht muss eine Version enthalten, die das Routing an einen kompatiblen Consumer ermöglicht. Außerdem muss die Bestätigung einen idempotenten Schlüssel verwenden, damit eine Wiederholung nicht zwei externe Aktionen erzeugt.
{
"event": "order.confirmation_requested",
"schema_version": 2,
"idempotency_key": "operacion-unica",
"order_id": "identificador"
}
Pausieren Sie vor dem Zurücksetzen bei Bedarf den Eingang neuer Jobs, identifizieren Sie die Nachrichten in Bearbeitung und bestätigen Sie, welche Consumer sie verarbeiten können. Prüfen Sie danach fehlgeschlagene Nachrichten und Wiederholungen kontrolliert. Löschen Sie keine Queue, um schneller wiederherzustellen: Dadurch können notwendige Belege entfernt oder Geschäftsvorgänge unvollständig zurückgelassen werden.
Den Plan in eine wiederholbare Praxis überführen

Eine ausgereifte Strategie hängt nicht vom individuellen Gedächtnis ab. Führen Sie pro Dienst ein kurzes Runbook mit den freigegebenen Befehlen, dem Speicherort der Logs, Beobachtungs-Dashboards, Verantwortlichen, Stoppbedingungen und bekannten Grenzen der Rücknahme. Erproben Sie das Verfahren in einer repräsentativen Umgebung, insbesondere nach Änderungen an Infrastruktur, Queues, Migrationen oder Integrationen.
Prüfen Sie nach jedem Incident oder Rollback, ob Erkennung, Kompatibilität, Automatisierung oder Entscheidung versagt haben. Das Ziel ist nicht, jede Rücknahme zu vermeiden; es ist, mit ausreichenden Informationen zwischen Zurücksetzen und Vorwärtskorrektur wählen zu können, ohne einen lokal begrenzten Incident in Datenverlust oder eine größere Unterbrechung zu verwandeln.



