FrankenPHP 1.13.0 wurde am 4. Oktober um 14:01 Uhr veröffentlicht. Die Version aktualisiert den gebündelten Caddy-Server von 2.11.4 aus FrankenPHP 1.12.7 auf 2.11.7. Mercure 1.0 ist nun integriert. Außerdem kommen die Kompatibilität mit PHP 8.6 und ein Upgrade auf Go 1.27 hinzu.
Fünf Sicherheitsprobleme sind behoben. Die Auflösung von SCRIPT_FILENAME unter Windows kann nicht mehr aus dem Dokumentenstamm ausbrechen, beschrieben in GHSA-868c-7h7m-mmj9. Caddy 2.11.7 verwirft Header mit Punkten standardmäßig. Damit wird eine Spoofing-Lücke im Zusammenhang mit PHPs Abbildung von Foo.Bar auf HTTP_FOO_BAR behoben, die GHSA-qcrp-8483-f2f2 zugeordnet ist. Beim Aufteilen des CGI-Pfads ist nun eine Grenze zwischen Pfadsegmenten erforderlich. /uploads/a.php.txt/b.php kann dadurch nicht mehr uploads/a.php ausführen, entsprechend GHSA-xxjp-cjxr-2x6m. putenv() schreibt nicht mehr in die systemweite Prozessumgebung. Werte können dadurch nicht mehr zwischen Requests und Threads durchsickern, GHSA-996f-w38m-f574. Ein speziell erzeugtes Array an frankenphp_log() bringt den Serverprozess nicht mehr zum Absturz, GHSA-4prg-hv4r-g6mv. Zwei der fünf Probleme sind hoch eingestuft.
Caddy 2.11.7 schützt vor Slowloris-Angriffen. Leerlauf-Timeouts für Lese- und Schreibvorgänge werden nach erfolgreicher Ein- oder Ausgabe zurückgesetzt. Verbindungen ohne Fortschritt werden beendet. Routen können diese Werte mit der Direktive timeouts anpassen. Der Matcher url_pattern folgt dem Webstandard URLPattern und unterstützt benannte Gruppen, Wildcards und reguläre Ausdrücke. Erfasste Gruppen werden zu Platzhaltern.
Der Header Incremental: ?1 folgt RFC 10036 und bietet eine standardisierte Entsprechung zu NGINX X-Accel-Buffering. reverse_proxy und encode übertragen solche Antworten sofort. Auch Server-Sent Events hinter encode werden nicht mehr gepuffert, was Mercure zugutekommt. Beim geordneten Herunterfahren wartet FrankenPHP auf Server aus früheren Konfigurationen, damit lang laufende Antworten einen Reload überstehen. Die globale Option tls_automate_names verwaltet Zertifikate für Namen außerhalb von Site-Blöcken.
Die Suche nach TLS-Zertifikaten ist etwa doppelt so schnell und benötigt 10 statt 15 Allokationen. Der Reverse Proxy gibt Teilantworten korrekt aus, reicht TCP-Half-Close bei hochgestuften Streams weiter und trennt aktive Health Checks nach ihrer Prüfkonfiguration. Mit expected_underscore_headers und expected_dot_headers lassen sich ausgewählte Header zulassen, die Caddy standardmäßig verwirft.
Mercure 1.0 ändert das Verhalten von mercure_publish(). Bei einem Topic aus dem reservierten Namespace /.well-known/mercure, einer mit # beginnenden ID, Steuerzeichen, ungültigem UTF-8, einem negativen Retry-Wert oder einem fehlenden Topic wird ein ValueError ausgelöst. Ein fehlgeschlagener Versand erzeugt eine RuntimeException mit der Meldung des Hubs. Publisher- und Subscriber-Schlüssel lassen sich über den neuen issuer-Block an einen vertrauenswürdigen Aussteller binden. Die Beispiel-Caddyfile und php-server --mercure verwenden diese Konfiguration.
Konfigurationen werden vor ihrer Aktivierung geprüft. Eine fehlende Worker-Datei, ein doppelter Worker-Name oder ein widersprüchliches Thread-Budget lässt die laufende Konfiguration weiterarbeiten. Bibliotheksnutzer erhalten dafür frankenphp.Validate().
Die Zählung der Threads ändert sich. num_threads bezeichnet nun die Threads für Requests, die kein Worker bedient. Worker-Threads kommen zusätzlich hinzu. Konfigurationen mit num_threads und Workern starten deshalb mehr Threads als zuvor. Der Start bricht ab, wenn max_threads kleiner als num_threads plus die Worker-Threads ist. Die Fehlermeldung nennt alle drei Werte. Die Standardwerte bleiben gleich.
Mercure-Konfigurationen mit publisher_jwt oder subscriber_jwt ohne protocol_version_compatibility sind nun ungültig. Für die Bindung an einen vertrauenswürdigen Aussteller muss der issuer-Block verwendet werden. Beim Hot Reload enthält $_SERVER['FRANKENPHP_HOT_RELOAD'] nun /.well-known/mercure?match=<topic>. Fest eingetragene URLs mit ?topic= müssen angepasst werden.
Caddy begrenzt Request-Header standardmäßig auf 16 KiB. max_header_size kann diesen Wert erhöhen. Blockierte Lese- und Schreibvorgänge werden nach einer Minute abgebrochen. Header mit Punkten werden wie Header mit Unterstrichen gefiltert. client_auth einer Wildcard-Site gilt nicht mehr für spezifischere Sites. Weitere ungültige Konfigurationen werden abgewiesen. PHP-Builds ohne --disable-zend-signals, also ZTS-Builds, verweigern den Start mit einer klaren Fehlermeldung. Damit werden Hänger und wachsender Speicherverbrauch vermieden.
Go-basierte PHP-Erweiterungen erhalten Thread(index), PHPThread.Pin(), PHPThread.IsRequestDone() und die C-Funktion frankenphp_thread_index(). php_server-Blöcke werden auf der FrankenPHP-Seite gespiegelt, damit Requests und Worker ihrem Block zugeordnet bleiben. phpinfo() erhält einen FrankenPHP-Abschnitt mit der Caddy-Version. Go-Code kann mit frankenphp.AddPHPInfoEntry() weitere Zeilen hinzufügen. Ab PHP 8.5 verwendet php-cli die eingebaute CLI-SAPI von PHP. Neustarts des Opcache-Shared-Memory werden protokolliert und ab PHP 8.4 in der experimentellen Metrik frankenphp_opcache_restarts{reason} gezählt. Diese Neustarts sind unter ZTS unsicher, dort sollte der Zähler null bleiben. Die Startprotokolle nennen nun total_threads und worker_threads.
Requests, die vor der Bereitschaft der regulären Threads eintreffen, hängen nicht mehr. Damit verschwinden zufällige 499- und 504-Antworten nach dem Start eines Containers. Worker-Abstürze erscheinen mit ihrem Exit-Status auf Warnstufe. Shutdown() wartet nicht mehr endlos auf einen Worker, der nach max_consecutive_failures seinen Start aufgegeben hat. Statische Builds verhindern, dass die gebündelte Erweiterung parallel behebbare Go-Fehler in Prozessabstürze umwandelt. Das von register_extensions gehaltene Erweiterungs-Array ist gegen einen möglichen Use-after-free geschützt. extgen verarbeitet in generierten Erweiterungen nun gruppierte und nullable Parameter, Callables, gemischte Rückgabewerte, Methoden-Wrapper, Konstanten und Integer-Literale.
Die Dokumentation erfasst Laufzeit-Einstellungen, die im Worker-Modus zwischen Requests bestehen bleiben, darunter ini_set(), stream_context_set_default(), date_default_timezone_set() und chdir(). Sie beschreibt außerdem Unterschiede bei der HTTP-Request-Filterung und erweitert die Metrik-Dokumentation. Eine Seite zu Yii 3 wurde ergänzt. Das Hot-Reload-Beispiel verwendet nun die korrigierte Idiomorph-CDN-URL. Türkische Übersetzungen wurden vervollständigt.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.