Start · Sprachen · PHP · Referenz · ReflectionFiber

ReflectionFiber

Klasse

Ermöglicht die Inspektion eines <code>Fiber</code>-Objekts zur Laufzeit, z. B. den aktuellen Status und den Stack-Trace.

seit PHP 8.1.0 Kategorie: oop

Signatur

class ReflectionFiber

Beschreibung

ReflectionFiber ist Teil der PHP-Reflection-API und erlaubt es, zur Laufzeit Informationen über ein Fiber-Objekt abzufragen. Fibers sind leichtgewichtige kooperative Nebenläufigkeitsprimitive, die in PHP 8.1 eingeführt wurden. Mit ReflectionFiber kann man den Zustand eines Fibers (gestartet, laufend, suspendiert, beendet) und seinen aktuellen Ausführungskontext inspizieren.

Ein typischer Anwendungsfall ist das Debugging und Monitoring von asynchronem oder event-loop-gesteuertem Code, bei dem mehrere Fibers gleichzeitig existieren und man deren Stack-Traces oder Zustände programmatisch auswerten möchte. Bibliotheken wie Revolt oder Amp nutzen diese Möglichkeiten intern für Diagnose-Werkzeuge.

Die Klasse bietet Methoden wie getCallable(), um die dem Fiber zugrunde liegende Callback-Funktion abzurufen, sowie getTrace() für den vollständigen Stack-Trace des suspendierten Fibers. Mit den Methoden isStarted(), isRunning(), isSuspended() und isTerminated() lässt sich der aktuelle Lebenszyklusstatus abfragen.

Parameter

Name Typ Default Beschreibung
$fiber Pflicht Fiber Das Fiber-Objekt, über das Informationen abgerufen werden sollen.

Beispiele

Fiber-Zustand und Stack-Trace inspizieren

<?php
$fiber = new Fiber(function (): void {
    $value = Fiber::suspend('suspendiert');
    echo "Fiber fortgesetzt mit: " . $value . PHP_EOL;
});

// Fiber starten – er suspendiert sich sofort
$fiber->start();

$reflection = new ReflectionFiber($fiber);

var_dump($reflection->isStarted());    // true
var_dump($reflection->isSuspended()); // true
var_dump($reflection->isRunning());   // false
var_dump($reflection->isTerminated()); // false

// Stack-Trace des suspendierten Fibers ausgeben
print_r($reflection->getTrace());

// Fiber fortsetzen
$fiber->resume('Hallo');

var_dump($reflection->isTerminated()); // true
bool(true) bool(true) bool(false) bool(false) Array ( [0] => Array ( [function] => {closure} ... ) ) Fiber fortgesetzt mit: Hallo bool(true)

Callable des Fibers abrufen

<?php
function meineAufgabe(): void {
    Fiber::suspend();
}

$fiber = new Fiber('meineAufgabe');
$fiber->start();

$reflection = new ReflectionFiber($fiber);
$callable = $reflection->getCallable();

// Gibt den Namen der Callback-Funktion aus
echo $callable; // meineAufgabe
meineAufgabe

// Wichtig · Fallstricke

Hinweis: getTrace() und getExecutingFile()/getExecutingLine() liefern nur dann sinnvolle Ergebnisse, wenn der Fiber tatsächlich suspendiert ist. Wird versucht, diese Methoden auf einem noch nicht gestarteten oder bereits beendeten Fiber aufzurufen, wird eine \ReflectionException ausgelöst.

ReflectionFiber ist primär für Debugging- und Monitoring-Szenarien gedacht. Im produktiven Anwendungscode sollte die direkte Fiber-API bevorzugt werden.