Signatur
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
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";
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";
}
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;
}
}
}
// Wichtig · Fallstricke
Wichtige Methoden im Überblick:
start(mixed ...$args): mixed— Startet den Fiber und übergibt Argumente an das Callable. Gibt den erstensuspend()-Wert zurück.resume(mixed $value = null): mixed— Setzt einen suspendierten Fiber fort.$valuewird als Rückgabewert vonsuspend()im Fiber sichtbar.getReturn(): mixed— Gibt den Rückgabewert des Callables zurück. Wirft eineFiberError-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.