The most dangerous phrase in the language is "We've always done it this way."
— Grace Hopper

Der RFC-Prozess von TrueAsync

TrueAsync treibt die Möglichkeit voran, den PHP-Kern über den RFC-Prozess zu verändern.

Haupt-RFC
Neuer RFCDraft

Async Scheduler Hook API

Autor: Edmond [HT]v0.1PHP 8.x

Ein Mechanismus zur Aktivierung konkurrenter Ausführung auf Ebene des PHP-Kerns. Der Kern stellt dedizierte Hooks bereit, die es erlauben, die Scheduler-Implementierung in eine eigene Erweiterung oder sogar in PHP-Code auszulagern.

Grundprinzipien
  • Striktes Opt-in: kein Overhead, bis ein Scheduler registriert ist
  • Fiber-kompatibel: bestehender Fiber-Code funktioniert weiter, und Fibers werden vom Scheduler übernommen
  • Continuation: ein symmetrischer A→B-Kontextwechsel auf Basis der Fiber-Maschinerie
  • Ein einziger Registrierungspunkt: SchedulerHook::register() aktiviert Konkurrenz engine-weit
  • Kontextisolation pro Koroutine: getrennter Userland- und interner Kontext
  • Freiheit für das Ökosystem: der Kern standardisiert nur die Aktivierung und die Scheduler-Schnittstelle, während spawn() / await() / Channels der Implementierung überlassen bleiben
RFC auf GitHub lesen
Motivation

Warum PHP eingebaute Asynchronität braucht

PHP ist eine der letzten großen Sprachen, der noch die eingebaute Unterstützung für konkurrente Ausführung auf Sprachebene fehlt. Python hat asyncio, JavaScript basiert auf einer Ereignisschleife, Go hat Goroutinen, Kotlin hat Koroutinen. PHP verharrt im Paradigma «ein Request, ein Prozess», obwohl die meisten realen Anwendungen den Großteil ihrer Zeit mit Warten auf I/O verbringen.

Das Fragmentierungsproblem

Heute lebt Async in PHP in Erweiterungen: Swoole, AMPHP, ReactPHP, jede mit ihrem eigenen Ökosystem und inkompatiblen APIs.

  • Jede Erweiterung schreibt ihre eigenen MySQL- / PostgreSQL- / Redis-Treiber neu
  • Eine Swoole-Bibliothek funktioniert nicht mit AMPHP und umgekehrt
  • Kernfunktionen (file_get_contents, curl_exec) lassen sich nicht nicht-blockierend machen
  • Hohe Einstiegshürde: ein ganzes separates Ökosystem muss erlernt werden

Die Lösung: ein Engine-Hook

TrueAsync fügt eine standardisierte Nahtstelle für Konkurrenz auf Ebene der PHP-Engine hinzu.

  • Transparenz: synchroner Code läuft unverändert in Koroutinen
  • Keine gefärbten Funktionen: keine async/await-Markierung
  • Ein einheitlicher Standard: eine Scheduler-Schnittstelle in der Engine für jede Erweiterung
  • Abwärtskompatibilität: bestehender Code funktioniert weiter

Eine typische PHP-Anwendung (Laravel, Symfony, WordPress) verbringt 70–90 % ihrer Zeit mit Warten auf I/O. Mit Koroutinen wird diese Leerlaufzeit effizient genutzt:

Szenario
Ohne Koroutinen
Mit Koroutinen
3 DB-Abfragen à 20 ms
60 ms
~22 ms
HTTP + DB + Datei
sequenziell
parallel
10 API-Aufrufe
10 × Latenz
~1 × Latenz
Praktische Szenarien
Webserver · FrankenPHP, RoadRunnerAPI Gateway · parallele AggregationHintergrundaufgaben · konkurrente WarteschlangenEchtzeit · WebSockets, Streaming
Geschichte

Frühere RFCs

Diese beiden RFCs beschrieben ein vollständiges Konkurrenzmodell direkt im Kern. Der neue Ansatz baut auf ihren Ideen auf, verlagert aber die nutzerseitige API aus dem Kern und behält in der Engine nur den Anschlusspunkt für den Scheduler.

RFC #1Draft

PHP True Async

Autor: Edmond [HT]v1.7PHP 8.6+

Der RFC, der ein Konkurrenzmodell für PHP definiert. Beschreibt Koroutinen, die Funktionen spawn() / await() / suspend(), das Coroutine-Objekt, die Schnittstellen Awaitable und Completable, kooperativen Abbruch, Fiber-Integration, Fehlerbehandlung und Graceful Shutdown.

Grundprinzipien
  • Minimale Änderungen am bestehenden Code, um Konkurrenz zu ermöglichen
  • Koroutinen bewahren die Illusion sequenzieller Ausführung
  • Automatischer Koroutinen-Wechsel bei I/O-Operationen
  • Kooperativer Abbruch, «cancellable by design»
  • Standardisiertes C-API für Erweiterungen
RFC auf wiki.php.net lesen
RFC #2Draft

Scope & strukturierte Konkurrenz

Autor: Edmond [HT]v1.0

Eine Erweiterung des True-Async-RFC. Führt die Klasse Scope ein, die die Lebensdauer von Koroutinen an den lexikalischen Gültigkeitsbereich bindet. Beschreibt die Scope-Hierarchie, Fehlerweitergabe, die Politik für «Zombie»-Koroutinen und kritische Abschnitte über protect().

Was es löst
  • Verhindern, dass Koroutinen über den Scope hinaus lecken
  • Automatische Ressourcenbereinigung beim Verlassen des Scope
  • Hierarchischer Abbruch: das Abbrechen des Elternteils bricht alle Kinder ab
  • Schutz kritischer Abschnitte vor Abbruch
  • Erkennung von Deadlocks und Self-Await
RFC auf wiki.php.net lesen

Wie diese RFCs zusammenhängen

Der erste RFC definiert Low-Level-Primitive: Koroutinen, Basisfunktionen und das C-API für Erweiterungen. Der zweite RFC ergänzt strukturierte Konkurrenz: Mechanismen zur Verwaltung von Koroutinen-Gruppen, die konkurrenten Code sicher und vorhersehbar machen.

RFC #1: True Async
RFC #2: Scope
Ebene
Primitive
Verwaltung
Bietet
spawn(), await(), Coroutine
Scope, TaskGroup, protect()
Analogien
Go goroutines, Kotlin coroutines
Kotlin CoroutineScope, Python TaskGroup
Ziel
Konkurrenten Code ausführen
Sichere Verwaltung des Lebenszyklus

An der Diskussion teilnehmen

RFCs werden auf der Mailingliste internals@lists.php.net und auf GitHub Discussions diskutiert. Beteiligen Sie sich auch am Gespräch auf Discord.