Zwei Ereignisse an einem einzigen Tag: Am 23. September 2026 veröffentlichte das Laravel-Team Version 13.33.0, und nur einen Tag später erreichte PHP 8.6 planmäßig den Meilenstein RC1. Wer beide Neuigkeiten getrennt betrachtet, verpasst den eigentlichen Punkt. Für Teams, die produktive Laravel-Anwendungen betreiben, treffen hier zwei Zeitachsen aufeinander, die in den kommenden Wochen gemeinsam geplant werden müssen.
Laravel 13.33 bringt sechs praxisnahe Verbesserungen mit, die vor allem Performance, Datenintegrität und Betriebssicherheit im Queue-System betreffen. Gleichzeitig zeigt der PHP-8.6-Fahrplan, dass Entwickler nicht mehr viel Zeit haben, ihre Kompatibilitätstests vorzubereiten. Dieser Artikel ordnet beide Entwicklungen ein, erklärt die wichtigsten Neuerungen im Detail und gibt eine Einschätzung, wie Teams jetzt vorgehen sollten.
Inhaltsverzeichnis
Key Takeaways
- Laravel 13.33.0 wurde am 23. September 2026 veröffentlicht und enthält unter anderem einen getaggten memoized Cache, das neue #[Refreshes]-Attribut und nullable Casts für JSON-Spalten.
- Migrationen für Indizes und Foreign Keys können jetzt per inplace() und lock() ohne blockierenden Tabellen-Rebuild ausgeführt werden.
- Ein neues Worker::$killOnTimeout-Flag gibt Queue-Workern die Wahl, bei Timeout entweder den Prozess zu beenden oder eine Exception zu werfen.
- PHP 8.6 erreichte am 24. September 2026 RC1, mit General Availability am 19. November 2026 geplant. Hauptfeature ist Partial Function Application (PFA).
- Laravel 14 zeichnet sich bereits auf dem master-Branch ab: PHP 8.4 als Mindestanforderung, Route::query() und ein authorize()-Wurf statt Rückgabewert.
Laravel 13.33 im Überblick: Das neue Release im Detail
Der offizielle Changelog im GitHub-Repository laravel/framework dokumentiert Laravel 13.33.0 als reguläres Minor-Release innerhalb des 13.x-Zweigs [1][3]. Anders als große Hauptversionen bringt ein solches Punkt-Release keine radikalen API-Bruche, sondern gezielte Verbesserungen, die aus der Community stammen und von Contributors wie Joost de Bruijn, Caleb White, Zein Ahmad, Sander Muller, Jack Bayliss und Jenthe Noordsij eingebracht wurden.
Bemerkenswert an Laravel 13.33 ist, dass fast jede Änderung ein konkretes, alltägliches Problem löst: Cache-Overhead bei getaggten Werten, veraltete Modelldaten nach dem Speichern, fehlerhafte NULL-Vergleiche bei JSON-Spalten, blockierende Datenbank-Migrationen und riskantes Verhalten bei Queue-Timeouts. Wer produktive Laravel-Anwendungen betreibt, wird mindestens eine dieser Situationen aus eigener Erfahrung kennen.
Tagged Memoized Cache: Weniger Cache-Treffer, mehr Performance
Der memoized Cache-Store (Cache::memo()) speichert Werte innerhalb einer einzelnen Anfrage im Arbeitsspeicher, damit wiederholte Lesevorgänge nicht jedes Mal das Cache-Backend belasten. Bisher fehlte diesem Store jedoch eine tags()-Methode. Entwickler mussten getaggte Cache-Aufrufe manuell in einen zweiten Cache::store('array')-Lookup einwickeln, um denselben Effekt zu erzielen.
Mit dem Beitrag von Joost de Bruijn ändert sich das grundlegend: Cache::memo()->tags([…]) erlaubt jetzt denselben Memoization-Effekt für getaggte Werte. Ein Lesevorgang trifft das eigentliche Cache-Backend nur noch einmal pro Anfrage, alle weiteren Zugriffe kommen direkt aus dem Speicher. Das Pull Request #61593 beschreibt die Implementierung im Detail. Für Anwendungen mit vielen wiederholten, getaggten Cache-Abfragen innerhalb einer Anfrage – etwa bei komplexen Dashboard-Views – bedeutet das weniger Round-Trips zum Cache-Server und damit potenziell messbare Latenzgewinne.
Das #[Refreshes]-Attribut: Automatisch aktuelle Modelldaten
Ein häufiges Problem in Eloquent-Anwendungen: Spalten wie virtualAs oder storedAs werden von der Datenbank selbst berechnet, nicht vom PHP-Code. Nach einem Create oder Update enthält das In-Memory-Model diese Werte trotzdem nicht automatisch – sie bleiben leer oder veraltet, bis jemand explizit refresh() aufruft.
Caleb White hat dafür das neue #[Refreshes]-Attribut sowie die passende $refreshes-Property beigetragen (Pull Request #61523). Wird die Klasse eines Models beispielsweise mit #[Refreshes('name')] annotiert, lädt Laravel die angegebene Spalte nach jedem Create oder Update automatisch neu aus der Datenbank. Im Beispiel aus dem Changelog bedeutet das: Nach User::create() enthält $user->name direkt den von der Datenbank berechneten Wert, ohne dass Entwickler manuell refresh() aufrufen müssen. Das reduziert Fehlerquellen gerade in Codebasen, die stark auf datenbankgenerierte Spalten setzen.
Nullable Casts für AsCollection und AsArrayObject
Ein subtiler, aber praxisrelevanter Bug betraf die Casts AsCollection und AsArrayObject. Wurde einem entsprechenden Attribut null zugewiesen, speicherte Laravel bislang den JSON-String "null" in der Spalte – nicht ein echtes Datenbank-NULL. Die Folge: Abfragen mit whereNull() fanden die betroffene Zeile nie, weil die Spalte technisch nicht NULL, sondern ein String mit dem Inhalt "null" war.
Zein Ahmad hat dieses Verhalten mit einem opt-in nullable()-Modus behoben (Pull Request #61596). Wird AsCollection::nullable() oder AsArrayObject::nullable() im Cast konfiguriert, schreibt Laravel bei einer Zuweisung von null tatsächlich ein echtes SQL-NULL in die Spalte. Da dieses Verhalten opt-in ist, bleibt bestehender Code unverändert – Teams können die Umstellung gezielt dort vornehmen, wo NULL-Vergleiche in WHERE-Klauseln relevant sind.
Index-Migrationen ohne Tabellensperren: inplace() und lock()
Migrationen, die Indizes oder Foreign Keys ändern, gelten in produktiven MySQL-Datenbanken oft als riskant, weil sie zu einem blockierenden Tabellen-Rebuild führen können. Sander Muller hat mit Pull Request #61602 zwei neue Modifier eingeführt, die genau dieses Risiko adressieren: inplace() und lock().
Mit inplace() kann eine Migration MySQL explizit anweisen, ALGORITHM=INPLACE zu verwenden, mit lock() lässt sich zusätzlich LOCK=NONE erzwingen. Ein Beispiel aus dem Changelog zeigt die Syntax:
$table->index('foo', 'foo_index')->inplace()->lock('none');
Beide Modifier funktionieren nicht nur bei index(), sondern auch bei unique(), primary(), fullText(), spatialIndex() und foreign(). Für Teams, die große Tabellen ohne Downtime ändern müssen, ist das ein direkter Hebel, um Migrationsfenster in produktiven Systemen zu verkürzen.
"Migrationen, die früher ein Wartungsfenster erforderten, lassen sich mit den neuen Modifiern gezielt ohne blockierenden Rebuild ausführen."
Worker-Timeout-Handling: Mehr Kontrolle bei Queue-Jobs
Im Queue-System von Laravel tötet ein Job, der sein konfiguriertes Timeout überschreitet, standardmäßig den kompletten Worker-Prozess. Der Supervisor startet danach einen neuen Worker – ein robustes, aber grobes Verhalten, das laufende Aufräumarbeiten des Jobs unterbindet.
Jack Bayliss hat mit Pull Request #61591 das neue Flag Worker::$killOnTimeout eingeführt. Setzt man es auf false, wirft der Worker bei Überschreitung des Timeouts stattdessen eine TimeoutExceededException, wodurch der Job die Möglichkeit erhält, sauber aufzuräumen, während der Worker-Prozess weiterläuft.
Diese Flexibilität bringt jedoch eine wichtige Warnung mit sich: Ein Job, dessen handle()-Methode den gesamten Code in ein breites try/catch wickelt, kann die TimeoutExceededException versehentlich abfangen und verschlucken. In diesem Fall bemerkt das System das Timeout gar nicht mehr richtig. Teams, die dieses Flag aktivieren, sollten ihre Exception-Handling-Strategie in Jobs genau prüfen.
Neue Test-Helper: mockArtisan() und realArtisan()
Der bekannte Test-Helper $this->artisan() erfüllt in Laravel traditionell zwei Aufgaben gleichzeitig: Er kann sowohl Erwartungen an einen Artisan-Befehl formulieren als auch den Befehl tatsächlich ausführen. Diese Doppelfunktion führt in Tests gelegentlich zu Unklarheiten darüber, welches Verhalten gerade greift.
Jenthe Noordsij hat mit Pull Request #61588 zwei spezialisierte Helper eingeführt: mockArtisan() gibt immer ein PendingCommand für Erwartungen zurück, während realArtisan() den Befehl garantiert ausführt und den Exit-Code als int liefert. Diese klare Trennung macht Testcode lesbarer und reduziert Missverständnisse in größeren Testsuiten, in denen beide Anwendungsfälle vorkommen.
Weitere Änderungen in Laravel 13.33.0
Neben den sechs zentralen Neuerungen enthält Laravel 13.33 mehrere kleinere, aber relevante Anpassungen:
| Änderung | Bedeutung für Entwickler |
|---|---|
| Support für Laravel Cloud Read Replicas bei PostgreSQL | Lastverteilung für Leseoperationen in Cloud-Umgebungen |
| valkey:// und valkeys:// Protokoll-Support | Direkte Kompatibilität mit Redis-kompatiblen Valkey-Servern |
| Fix für SQLite-Schema-Dumps mit Shadow-Tabellen | Zuverlässigere Schema-Exporte in Testumgebungen |
| Test-Support für MariaDB 12.3 | Breitere Datenbankabdeckung in der CI-Pipeline |
Diese Punkte wirken auf den ersten Blick klein, summieren sich aber zu einem Release, das den Alltag vieler Teams direkt berührt – insbesondere jene, die bereits auf Valkey oder Laravel Cloud setzen [2][4].
PHP 8.6 erreicht RC1: Fahrplan und wichtigstes Feature
Während das Laravel-Team an Version 13.33 arbeitete, näherte sich parallel der nächste große PHP-Meilenstein: Nach einem harten Feature-Freeze am 22. September 2026 erreichte PHP 8.6 am 24. September 2026 planmäßig den Status RC1. (mehr Hintergrund dazu in unserem ausführlichen PHP-8.6-Artikel.) Der offizielle PHP-Wiki-Releaseplan, zitiert von digitalmatters.me, nennt als nächste Schritte RC2 am 8. Oktober, RC3 am 22. Oktober und RC4 am 5. November 2026, mit General Availability am 19. November 2026.
Das zentrale Feature von PHP 8.6 ist Partial Function Application, kurz PFA. Damit lässt sich eine Closure erzeugen, indem eine Funktion mit Platzhaltern statt echten Argumenten aufgerufen wird: ein einzelnes Fragezeichen (?) markiert eine offene Argumentposition, drei Punkte (…) stehen für alle restlichen Argumente. Das zugehörige RFC wurde einstimmig mit 33 zu 0 Stimmen angenommen – ein deutliches Signal, dass die PHP-Community dieses Feature als sinnvolle Ergänzung der Sprache betrachtet.
Für Laravel-Entwickler ist die Zeitachse relevant: RC-Phasen dienen ausdrücklich dem Auffinden von Regressionen, nicht dem produktiven Einsatz. Die Kompatibilität von Laravel 13.33 mit PHP 8.6 RC1 gilt Stand heute als experimentell und sollte nicht mit produktionsreifer Unterstützung verwechselt werden.
Laravel 13.33 und PHP 8.6 RC1: Kompatibilität und Teststrategie
Laravel 13 wurde für die aktuell offiziell unterstützten PHP-Versionen entwickelt und getestet, nicht für Release-Candidate-Versionen einer kommenden Hauptversion [6][9]. Das bedeutet konkret: Wer Laravel 13.33 heute in Produktion betreibt, sollte PHP 8.6 RC1 ausschliesslich in isolierten Testumgebungen einsetzen, nicht in produktiven Systemen.
Eine sinnvolle Teststrategie für die kommenden Wochen umfasst mehrere Schritte:
- Eine separate CI-Pipeline mit PHP 8.6 RC1 parallel zur bestehenden Produktions-PHP-Version aufsetzen.
- Die vollständige Testsuite regelmäßig gegen jede neue Release-Candidate-Stufe (RC2, RC3, RC4) laufen lassen, um frühe Regressionen zu erkennen.
- Besonders Bereiche prüfen, die von Sprachfeatures wie Partial Function Application betroffen sein könnten, etwa Callback-basierte APIs und funktionale Hilfsfunktionen.
- Composer-Abhängigkeiten und Drittanbieter-Pakete auf explizite PHP-Versionsbeschränkungen hin überprüfen, bevor ein Umstieg erwogen wird.
Diese Vorsicht zahlt sich aus, sobald PHP 8.6 im November 2026 General Availability erreicht. Teams, die bereits jetzt testen, vermeiden böse Überraschungen beim späteren produktiven Umstieg.
Ausblick auf Laravel 14
Parallel zu den aktuellen Punkt-Releases zeichnet sich auf dem master-Branch bereits ab, wohin die nächste Hauptversion steuert. Ein Laravel-14-Preview-Roundup von Paul Redmond, zitiert im "A Day With Laravel"-Newsletter vom 23. September 2026, nennt drei zentrale Punkte: PHP 8.4 wird die neue Mindestanforderung für Laravel 14, ein neues Route::query() ergänzt das Routing-System, und $user->authorize() wirft künftig eine Exception statt lediglich false zurückzugeben.
Diese Änderungen deuten auf eine klarere, strengere Fehlerbehandlung und eine Anhebung der PHP-Mindestversion hin – beides Themen, die Teams schon jetzt in ihre langfristige Roadmap für 2027 und darüber hinaus einplanen sollten. Wie genau sich Laravel 14 letztlich von Laravel 13.33 unterscheiden wird, bleibt bis zur offiziellen Ankündigung eine Einschätzung auf Basis des aktuellen Entwicklungsstands.
Fazit
Laravel 13.33 zeigt, dass ein Minor-Release keineswegs bedeutungslos sein muss: Der getaggte memoized Cache, das #[Refreshes]-Attribut, nullable Casts, lock-freie Index-Migrationen, das flexible Worker-Timeout-Verhalten und die neuen Test-Helper lösen jeweils ein konkretes Problem aus dem Entwickleralltag. Gleichzeitig erinnert der parallele Start von PHP 8.6 RC1 daran, dass Kompatibilitätsarbeit kein einmaliges Projekt ist, sondern ein fortlaufender Prozess.
Für Entwicklerteams ergeben sich daraus klare nächste Schritte: Laravel 13.33 zeitnah in einer Staging-Umgebung testen, die neuen Features gezielt dort einsetzen, wo sie echten Mehrwert bringen, und parallel eine isolierte Testpipeline für PHP 8.6 RC1 aufbauen. Wer diese beiden Spuren jetzt getrennt, aber koordiniert verfolgt, ist sowohl für die General Availability von PHP 8.6 im November 2026 als auch für den kommenden Umstieg auf Laravel 14 gut vorbereitet.
References
[1] Laravel – https://releasebot.io/updates/laravel [2] Releases – https://laravel-news.com/tag/releases [3] Releases – https://laravel.com/framework/docs/master/releases [4] News – https://laravel-news.com/category/news [6] Laravel – https://endoflife.date/laravel [9] Releases – https://laravel.com/framework/docs/13.x/releases





