NCA Social Media
Aktualisiert:
Autor:
Roland Golla
Grüne Startrampe mit rot weißer Rakete und Schild PHP 8.6 Upgrade

Was ein PHP 8.6 Upgrade bedeutet

Ein PHP 8.6 Upgrade ist der Wechsel einer bestehenden PHP Anwendung auf die neue Version 8.6, inklusive aller Abhängigkeiten, Server und Pipelines. Die eigentliche Arbeit steckt im Testen: Deprecations finden, Brüche bei Sessions und Dateizugriffen absichern und erst dann Production umstellen.
Der Funktionsumfang von PHP 8.6 steht fest, und die Release Candidates sind verfügbar. Genau das ist das beste Fenster: Fehler im Release Candidate landen noch beim PHP Team statt in eurem Livebetrieb. Was 8.6 an Features bringt, zeigt unser PHP 8 Versionen Vergleich. Diese Seite geht um den Weg dorthin.
Inhalt
NCA Cypress Workshop mit Cypress Ambassador Roland Golla

E2E Tests, die euer Team selbst schreibt

Ein Tag inhouse mit Roland Golla, offizieller Cypress Ambassador und seit über 20 Jahren in Testing und Refactoring zu Hause. Auf unserem YouTube Kanal zeigt er in über 70 Live Coding Tutorials, wie Cypress in echten Projekten läuft. Dazu kommt unser Open Source Plugin NCA TESTIFY: Basistests für jede Website, mit einer Zeile im CI/CD Setup. Im Workshop lernt euer Team Setup, stabile Selektoren, Custom Commands und Tests in der Pipeline.

  1. 1
    Kostenloses Vorgespräch
    Projekt, Stack und Teststand klären
  2. 2
    Workshoptag bei euch
    Setup, Patterns und erste Tests im Team
  3. 3
    Praxistag optional
    Tests im eigenen Projekt und in CI
Roland Golla
Roland Golla
Fullstack Developer
Zum Cypress Workshop arrow_forward

PHP 8.6 Upgrade mit NCA richtig angehen

Wir arbeiten jeden Tag mit PHP, Symfony und Sulu in Production. Unsere Pipelines laufen mit PHPUnit, PHPStan, Psalm und Rector, und neue PHP Versionen landen bei uns zuerst als zusätzlicher Job in GitHub Actions oder GitLab CI. Seit über 20 Jahren bringen wir PHP Projekte von einer Version zur nächsten, und als Open Source Aktivisten verfolgen wir die RFCs, bevor sie im Changelog stehen.
Für euer Upgrade übernehmen wir die Umstellung im NCA PHP Update und sichern sie mit Rector PHP und PHPStan ab. Gewachsenen Code räumen wir im PHP Refactoring auf, und für große Altprojekte gehen wir den Weg über die Legacy Modernisierung. Damit das Upgrade nicht an der Pipeline scheitert, richten wir das CI CD Setup mit Docker und Staging gleich mit ein.

Der Weg bis zum Release von PHP 8.6

Release Candidates enthalten nur noch Bugfixes. Neue Features kommen nicht mehr dazu. Für euch heißt das: Was ihr jetzt testet, ist fast genau das, was am Release Tag erscheint. Die Release Manager für PHP 8.6 sind Daniel Scherzer, Matteo Beccati und Joe Ferguson. Den offiziellen Fahrplan pflegt das PHP Wiki.
  • RC1 wurde wegen eines Packaging Fehlers übersprungen, RC2 war der erste Release Candidate.
  • RC3 brachte wichtige Korrekturen an Fibers, hrtime() und array_map().
  • RC4 und RC5 sind die letzten Testbuilds vor dem finalen Release.
  • PHP 8.6.0 folgt nach RC5 als stabile Version.

Release Candidates sind nicht für Production gedacht. Sie gehören in die CI, auf Staging und auf eure lokalen Maschinen.

Die vier Stufen eines PHP Upgrades

Ein Upgrade gelingt, wenn ihr es in Stufen denkt. Jede Stufe hat ein klares Ziel und ein eigenes Werkzeug. Erst wenn eine Stufe grün ist, geht es weiter. So bleibt das Risiko klein, und ihr wisst jederzeit, wo ihr steht.

PHP 8.6 Upgrade Stufen im Überblick

Stufe Werkzeuge Umgebung
1. CI Matrix GitHub Actions oder GitLab CI mit PHP 8.6 RC als zusätzlichem Job, PHPUnit, E_ALL CI und lokale Docker Umgebung
2. Composer composer prohibits, composer update, composer audit Lokal und CI
3. Rector Rector mit withPhpSets(), PHPStan und Psalm mit Zielversion 8.6 Lokal, Review per Merge Request
4. Rollout composer check-platform-reqs, Cypress E2E, Sentry und Grafana Staging, dann Production in Stufen
Aufsteigendes Säulendiagramm der vier PHP 8.6 Upgrade Stufen CI Matrix, Composer, Rector und Rollout. Inhalt steht textuell in der Tabelle darüber.

Stufe eins mit dem Release Candidate in der CI

Der erste Schritt kostet fast nichts: Ihr ergänzt eure Pipeline um einen Job mit PHP 8.6 neben der Version, die heute in Production läuft. Beide Jobs müssen grün bleiben. Wichtig ist error_reporting auf E_ALL, sonst seht ihr die Deprecations nicht. Wer lokal mit Docker oder DDEV arbeitet, startet den gleichen Stand auch auf der eigenen Maschine.
Code:
          

# .github/workflows/tests.yml
jobs:
  phpunit:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        php: ['8.4', '8.6']
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          ini-values: error_reporting=E_ALL
      - run: composer install --no-progress
      - run: vendor/bin/phpunit

Lasst die Testsuite komplett laufen, nicht nur ein paar Unit Tests. Ein Upgrade zeigt seine Probleme oft dort, wo kaum Tests existieren. Wenn euch dort Absicherung fehlt, helfen Characterization Tests vor dem Umbau.

Stufe zwei mit Composer und euren Abhängigkeiten

Euer eigener Code ist selten das größte Problem. Meist blockiert ein Paket, das PHP 8.6 in seinen Versionsangaben noch nicht erlaubt. Composer zeigt euch das mit einem Befehl, ganz ohne das Upgrade schon durchzuführen.
Code:
          

# Welche Pakete blockieren PHP 8.6?
composer prohibits php 8.6

# Danach Pakete aktualisieren und Sicherheit prüfen
composer update --with-all-dependencies
composer audit

Aktualisiert die blockierenden Pakete zuerst, solange ihr noch auf der alten PHP Version seid. Dann bleibt der eigentliche Versionswechsel klein. Bekannte Lücken in Abhängigkeiten findet Composer Audit, ungenutzte oder fehlende Pakete der Composer Dependency Analyser.

Stufe drei mit Rector und statischer Analyse

Rector nimmt euch die mechanische Arbeit ab. Mit einem leeren withPhpSets() liest Rector die Zielversion direkt aus der require Angabe in eurer composer.json. Ihr hebt dort die PHP Version an und startet zuerst einen Dry Run.
Code:
          

// rector.php
use Rector\Config\RectorConfig;

return RectorConfig::configure()
    ->withPaths([__DIR__ . '/src', __DIR__ . '/tests'])
    ->withPhpSets();

Code:
          

vendor/bin/rector process --dry-run

Prüft den Diff im Merge Request, bevor ihr ihn übernehmt. Rector ändert nur, was es sicher umschreiben kann. Verhaltensänderungen in Funktionen, die ihr aufruft, findet es nicht. Dafür laufen PHPStan und Psalm mit Zielversion 8.6 mit. Wer das Upgrade schon vor dem Umbau abschätzen will, nutzt zusätzlich PHPCompatibility.

Deprecations in PHP 8.6 rechtzeitig finden

Deprecations brechen nichts. Euer Code läuft weiter und meldet E_DEPRECATED. Entfernt werden die Funktionen erst mit PHP 9. Trotzdem lohnt es sich, sie jetzt abzuarbeiten, solange der Fix klein ist. Die Sammel RFC für PHP 8.6 wurde mit 31 angenommenen und 4 abgelehnten Vorschlägen beschlossen.
Diese Änderungen treffen bestehenden Code am häufigsten:
  • Reservierte Namen: let und is als Namen für Klassen, Funktionen oder Konstanten, readonly als Funktionsname, namespace als Klassenkonstante und _ als Konstante oder use Alias.
  • Alias Funktionen: is_integer(), is_long(), is_double() und doubleval() weichen is_int(), is_float() und floatval().
  • spl_object_hash() weicht spl_object_id(). Die Funktion steckt in vielen älteren Paketen.
  • return in finally Blöcken und Rückgabewerte aus __construct() oder __destruct().
  • CSV Methoden von SplFileObject, strcoll() und SORT_LOCALE_STRING.
Die reservierten Namen sucht ihr am schnellsten mit statischer Analyse oder einem einfachen grep. Besonders is trifft Test Code, denn Matcher Bibliotheken wie Hamcrest nutzen eine Funktion mit genau diesem Namen. Prüft deshalb auch eure Dev Abhängigkeiten.
Code:
          

grep -rnE "function (is|let|readonly)\s*\(" src tests
grep -rn "spl_object_hash" src vendor --include=*.php | head

Was die Release Candidates schon gelehrt haben

Wer früh getestet hat, sollte jetzt noch einmal testen. RC3 hat drei Regressionen korrigiert, die PHP 8.6 selbst eingeführt hatte. Genau solche Fälle zeigen, warum ein Release Candidate in die CI gehört und nicht in Production.
  • Fibers ohne Warnungen: In den Betas und RC2 startete ein Fiber ohne php.ini mit error_reporting auf 0. Das betraf offizielle Docker Images und php -n. Alles, was auf Revolt, AMPHP oder anderen Event Loops läuft, hat Warnungen verschluckt.
  • hrtime() zu schnell: Der Wechsel auf CLOCK_MONOTONIC_RAW ließ den Timer auf manchen Systemen rund vier Prozent zu schnell laufen. RC3 nutzt wieder CLOCK_MONOTONIC wie PHP 8.5. Benchmarks aus den Betas solltet ihr wiederholen.
  • array_map() im Strict Mode: Ein neuer, schnellerer Pfad hat in strict_types Dateien plötzlich Argumente geprüft und TypeErrors geworfen. Dieser Pfad ist dort jetzt aus.
Dazu kommen die bewusst geänderten Session Defaults. session.use_strict_mode, session.cookie_httponly und SameSite Lax sind ab Werk aktiv. Das ist sicherer, kann aber Login Flows und Payment Rücksprünge treffen, die ein Session Cookie per JavaScript lesen oder bei Cross Site POST Requests erwarten. Diese Wege sichert ihr am besten mit einem Cypress E2E Testing Setup ab.

Stufe vier mit dem Rollout in Production

Wartet mit Production auf das finale Release und darauf, dass eure Abhängigkeiten PHP 8.6 offiziell unterstützen. Dann geht ihr in Stufen vor: erst Staging, dann ein Server, ein Worker Pool oder ein Teil des Traffics.
  • Alle Installationen finden: php -v auf jedem Server, für CLI und PHP FPM getrennt, dazu Cronjobs, Queue Worker, Docker Base Images und CI Images.
  • Plattform prüfen: composer check-platform-reqs auf den neuen Servern bestätigt PHP Version und Extensions.
  • Logs beobachten: Sentry und das PHP Error Log zeigen Warnungen, die im Test nicht aufgefallen sind.
  • Rückweg offen halten: Das alte Image bleibt verfügbar, bis alles stabil läuft. Mit Feature Flags trennt ihr Deployment und Release zusätzlich.
Code:
          

composer check-platform-reqs
php -v
php-fpm -v

Zielversion wählen im Vergleich

Zielversion Support laut php.net Passt für
PHP 8.4 Active Support bis Ende 2026, Security Fixes bis Ende 2028 Teams, die jetzt sofort umstellen müssen und ein stabiles Ökosystem brauchen
PHP 8.5 Active Support bis Ende 2027, Security Fixes bis Ende 2029 Die sichere Wahl für Production Umstellungen in den nächsten Wochen
PHP 8.6 Release geplant am 19. November 2026, Support Daten folgen mit dem Release Neue Projekte und Teams, die ihren Rollout nach dem Release und nach ihren Abhängigkeiten planen

I think we should think very carefully whether we can avoid disrupting that much code.

Rowan Tommins, PHP Internals Contributor, zur Deprecation von is als Name – via PHP News

Die NCA Erfahrung mit PHP Upgrades

Bei NCA ist ein PHP Upgrade kein Großprojekt, sondern ein wiederkehrender Teil der Arbeit. Zuerst kommen die Quality Gates: statische Analyse mit PHPStan und Psalm, Unit Tests mit PHPUnit, Anwendungstests als PHP Functional Test und Cypress für die wichtigsten Nutzerwege. Erst dann räumen wir auf. Wie Rector Code über den Abstract Syntax Tree umschreibt, erklärt unser Glossar zu Rector PHP.
Wie gut eure Tests den geänderten Code abdecken, zeigt Patch Coverage im Merge Request. Für große Altprojekte bauen wir lieber parallel neu, statt im Legacy weiterzuarbeiten, etwa mit dem Strangler Fig Pattern und einem Parallel Run. Wenn Coding Agents beim Upgrade helfen, brauchen sie feste Regeln. Die liefern die NCA PHP AI Coding Guidelines. Abgerechnet wird transparent: kostenloses Kennenlernen, Aufwand schätzen, minutengenau abrechnen.
CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.
Erreichen Sie unsere PHP Consultant Spezialisten

Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.

Häufige Fragen zum PHP 8.6 Upgrade

Die wichtigsten Antworten zu Zeitplan, Deprecations, Tests und Rollout beim Wechsel auf PHP 8.6.
Wann erscheint PHP 8.6 im Jahr 2026?

PHP 8.6.0 ist laut offiziellem Zeitplan im PHP Wiki für den 19. November 2026 geplant. Der letzte Release Candidate RC5 erschien am 5. November. Neue Features kommen nicht mehr dazu, Release Candidates enthalten nur noch Bugfixes. Die Zeit bis zum Release eignet sich ideal, um eure Anwendung in der CI gegen PHP 8.6 zu testen.

Sollte ich 2026 schon den Release Candidate von PHP 8.6 testen?

Ja, aber nur in der CI, auf Staging und lokal. Ein zusätzlicher Pipeline Job mit PHP 8.6 kostet wenig und zeigt Deprecations und Brüche früh. Fehler, die ihr jetzt findet, könnt ihr noch an das PHP Team melden. Production stellt ihr erst nach dem finalen Release um.

Was bricht 2026 beim Upgrade auf PHP 8.6 am häufigsten?

Am häufigsten treffen die neuen Session Defaults mit Strict Mode, HttpOnly und SameSite Lax. Sie können Login Flows und Payment Rücksprünge stören. Dazu kommen Funktionen, die jetzt bei ungültigen Werten einen ValueError werfen, und reservierte Namen wie is und let, die eine Deprecation auslösen.

Welche Zielversion ist 2026 die richtige für ein PHP Upgrade?

Für eine Umstellung in den nächsten Wochen ist PHP 8.5 die sichere Wahl, mit Security Fixes bis Ende 2029. PHP 8.4 passt, wenn euer Ökosystem noch nicht weiter ist. PHP 8.6 lohnt sich für neue Projekte und für Teams, die ihren Rollout nach dem Release planen.

Wie lange dauert ein PHP 8.6 Upgrade 2026?

Das hängt vor allem von Testabdeckung und Abhängigkeiten ab, nicht von der Größe des Codes. Mit gutem Test Setup und Rector ist ein Upgrade von 8.5 auf 8.6 oft schnell erledigt. Fehlen Tests oder blockieren alte Pakete, kostet die Vorarbeit die meiste Zeit. Eine ehrliche Schätzung geht erst nach einem Blick in den Code.

Was sind Deprecations in PHP 8.6?

Deprecations sind Funktionen und Schreibweisen, die noch funktionieren, aber eine E_DEPRECATED Meldung auslösen. Sie werden mit PHP 9 entfernt. Für PHP 8.6 wurden in einer Sammel RFC 31 Vorschläge angenommen, darunter Alias Funktionen wie is_integer(), spl_object_hash() und reservierte Namen wie let und is.

Wie finde ich heraus, welche Pakete PHP 8.6 blockieren?

Mit dem Befehl composer prohibits php 8.6. Composer listet jedes installierte Paket, dessen Versionsangabe PHP 8.6 ausschließt, und nennt die passende Regel. Aktualisiert diese Pakete zuerst, solange ihr noch auf eurer alten PHP Version seid. So bleibt der eigentliche Wechsel klein und überschaubar.

Was macht Rector beim PHP 8.6 Upgrade?

Rector schreibt Code automatisch auf neue Syntax um und löst viele Deprecations. Mit einem leeren withPhpSets() liest es die Zielversion aus der composer.json. Rector ändert nur, was es sicher umschreiben kann. Verhaltensänderungen in aufgerufenen Funktionen findet es nicht, dafür braucht ihr Tests und statische Analyse.

Warum sollte ich nach RC3 noch einmal testen?

Weil RC3 drei Regressionen korrigiert hat, die PHP 8.6 selbst eingeführt hatte. Fibers starteten ohne php.ini mit abgeschalteten Warnungen, hrtime() lief auf manchen Systemen zu schnell und array_map() warf im Strict Mode TypeErrors. Wer auf früheren Builds getestet hat, hat womöglich falsche Ergebnisse gesehen.

Brauche ich für das Upgrade auf PHP 8.6 E2E Tests?

Für kritische Nutzerwege ja. Unit Tests prüfen einzelne Klassen, aber die neuen Session Defaults wirken erst im Browser. Login, Checkout, Formulare und Payment Rücksprünge sichert ihr am besten mit Cypress ab. So seht ihr nach jedem Upgrade Schritt, ob die wichtigsten Wege noch funktionieren.

Kann ich PHP 8.6 in Docker schon nutzen?

Ja, für Release Candidates gibt es Builds, die ihr in der CI oder lokal starten könnt. Achtet darauf, dass offizielle Images ohne php.ini laufen. Genau dort trat in den Betas der Fiber Fehler auf. Setzt error_reporting deshalb bewusst auf E_ALL, damit ihr alle Meldungen seht.

Was passiert mit meinem Code, wenn ich Deprecations ignoriere?

Zunächst nichts. Euer Code läuft unter PHP 8.6 weiter und schreibt nur Meldungen ins Log. Mit PHP 9 werden die betroffenen Funktionen aber entfernt, dann bricht der Code. Je länger ihr wartet, desto mehr Stellen sammeln sich. Kleine Fixes direkt beim Upgrade sind deutlich günstiger.