Start · Sprachen · PHP · Referenz · Fiber

Fiber

Klasse

Ermöglicht unterbrechbare, stackbasierte Ausführungseinheiten (Koroutinen), die an beliebiger Stelle im Aufrufstapel pausiert und wieder fortgesetzt werden können.

seit PHP 8.1.0 Kategorie: misc

Signatur

class Fiber

Beschreibung

Fiber stellt eine leichtgewichtige Koroutine dar, die es erlaubt, eine PHP-Funktion an beliebiger Stelle im Aufrufstapel zu unterbrechen (Fiber::suspend()) und später gezielt wieder fortzusetzen (resume()). Anders als einfache Generatoren deckt ein Fiber den gesamten Aufrufstapel ab: Die Unterbrechung kann tief in geschachtelten Funktionsaufrufen stattfinden.

Ein Fiber-Objekt wird mit einem Callable erstellt und dann durch Aufruf von start() gestartet. Beim Aufruf von Fiber::suspend($value) innerhalb des Fibers wird die Kontrolle an den aufrufenden Code zurückgegeben, der $value erhält. Mit resume($value) wird der Fiber wieder aufgenommen, wobei $value als Rückgabewert von suspend() dient.

Fibers eignen sich besonders für die Implementierung von asynchronen Bibliotheken, Event-Loops und kooperativem Multitasking, ohne auf externe Extensions angewiesen zu sein. Sie sind die Grundlage moderner PHP-Async-Frameworks wie ReactPHP, Amp oder Revolt.

Zu beachten ist, dass Fibers kein echtes Multithreading bieten – PHP bleibt single-threaded. Das Scheduling (wann welcher Fiber läuft) muss vom Anwendungscode selbst organisiert werden.

Parameter

Name Typ Default Beschreibung
$callback Pflicht callable Das Callable, das innerhalb des Fibers ausgeführt wird. Es kann über Fiber::suspend() pausiert werden und erhält beim Start die Argumente, die an start() übergeben wurden.

Rückgabewert

Typ

Beispiele

Einfaches Suspend und Resume

<?php
$fiber = new Fiber(function (): void {
    $eingabe = Fiber::suspend('Erster Wert');
    echo "Fiber erhielt: " . $eingabe . "\n";
    Fiber::suspend('Zweiter Wert');
    echo "Fiber läuft bis zum Ende.\n";
});

$wert1 = $fiber->start();
echo "Suspendiert mit: " . $wert1 . "\n"; // Erster Wert

$wert2 = $fiber->resume('Hallo Fiber');
echo "Suspendiert mit: " . $wert2 . "\n"; // Zweiter Wert

$fiber->resume();
echo "Fiber beendet: " . ($fiber->isTerminated() ? 'ja' : 'nein') . "\n";
Suspendiert mit: Erster Wert Fiber erhielt: Hallo Fiber Suspendiert mit: Zweiter Wert Fiber läuft bis zum Ende. Fiber beendet: ja

Rückgabewert eines Fibers auslesen

<?php
$fiber = new Fiber(function (): int {
    $a = Fiber::suspend();
    $b = Fiber::suspend();
    return $a + $b;
});

$fiber->start();
$fiber->resume(10);
$fiber->resume(32);

if ($fiber->isTerminated()) {
    echo "Ergebnis: " . $fiber->getReturn() . "\n";
}
Ergebnis: 42

Einfache kooperative Event-Loop mit mehreren Fibers

<?php
$aufgaben = [];

$erstelle = function (string $name, int $schritte) use (&$aufgaben): void {
    $fiber = new Fiber(function () use ($name, $schritte): void {
        for ($i = 1; $i <= $schritte; $i++) {
            echo "{$name}: Schritt {$i}\n";
            Fiber::suspend();
        }
    });
    $aufgaben[] = $fiber;
};

$erstelle('Aufgabe A', 3);
$erstelle('Aufgabe B', 2);

// Alle Fibers starten
foreach ($aufgaben as $fiber) {
    $fiber->start();
}

// Reihum fortsetzen, bis alle fertig
$aktiv = true;
while ($aktiv) {
    $aktiv = false;
    foreach ($aufgaben as $fiber) {
        if (!$fiber->isTerminated()) {
            $fiber->resume();
            $aktiv = true;
        }
    }
}
Aufgabe A: Schritt 1 Aufgabe B: Schritt 1 Aufgabe A: Schritt 2 Aufgabe B: Schritt 2 Aufgabe A: Schritt 3

// Wichtig · Fallstricke

Wichtige Methoden im Überblick:

  • start(mixed ...$args): mixed — Startet den Fiber und übergibt Argumente an das Callable. Gibt den ersten suspend()-Wert zurück.
  • resume(mixed $value = null): mixed — Setzt einen suspendierten Fiber fort. $value wird als Rückgabewert von suspend() im Fiber sichtbar.
  • getReturn(): mixed — Gibt den Rückgabewert des Callables zurück. Wirft eine FiberError-Exception, wenn der Fiber noch nicht beendet ist.
  • isStarted(): bool, isRunning(): bool, isSuspended(): bool, isTerminated(): bool — Zustandsabfragen.
  • static Fiber::suspend(mixed $value = null): mixed — Statische Methode, die nur innerhalb eines laufenden Fibers aufgerufen werden darf.

Fallstricke: Fiber::suspend() außerhalb eines Fibers oder in einem bereits laufenden/beendeten Fiber aufzurufen wirft eine FiberError-Exception. Ebenso führt resume() auf einem nicht-suspendierten Fiber zu einem Fehler.

Kein echtes Multithreading: Fibers sind kooperativ – ein Fiber blockiert die gesamte PHP-Laufzeit, bis er suspend() aufruft. Für CPU-intensive Parallelität sind andere Lösungen (z. B. parallel-Extension) erforderlich.