Übersicht über Fibers
(PHP 8 >= 8.1.0)
Fibers stellen unterbrechbare Funktionen dar, die den gesamten Aufrufstapel
(Call-Stack) umfassen. Sie können an jeder Stelle des Aufrufstapels
unterbrochen werden, wobei die Ausführung innerhalb der Fiber solange
unterbrochen wird, bis die Fiber zu einem späteren Zeitpunkt fortgesetzt
wird.
Fibers halten den gesamten Ausführungsstapel an, sodass der direkte
Aufrufer der Funktion nicht ändern muss, wie er die Funktion aufruft.
Mit Fiber::suspend() kann die Ausführung an jeder
Stelle im Aufrufstapel unterbrochen werden (d. h. der Aufruf von
Fiber::suspend() kann in einer tief verschachtelten
Funktion liegen oder auch gar nicht existieren).
Im Gegensatz zu einem Generator, der keinen Stapel
hat, hat jede Fiber ihren eigenen Aufrufstapel,
sodass sie innerhalb tief verschachtelter Funktionsaufrufe unterbrochen
werden kann. Im Gegensatz zu einer Funktion, die yield
verwendet und eine
Generator-Instanz zurückgeben muss, muss eine
Funktion, die einen Unterbrechungspunkt deklariert (d. h.
Fiber::suspend() aufruft), ihren Rückgabetyp nicht
ändern.
Fibers können beim Aufruf einer beliebigen Funktion unterbrochen werden.
Dies gilt auch für Funktionen, die innerhalb der PHP-VM aufgerufen werden,
z. B. Funktionen, die an array_map() übergeben werden
oder Methoden eines Iterator-Objekts, die von
foreach
aufgerufen werden.
Sobald die Ausführung einer Fiber unterbrochen wurde, kann sie wieder
aufgenommen werden, indem ein beliebiger Wert an
Fiber::resume() übergeben wird oder indem
Fiber::throw() verwendet wird, um eine Exception an
die Fiber zu senden. Bei der Wiederaufnahme wird von
Fiber::suspend() ein Wert zurückgegeben (oder es
wird eine Exception ausgelöst).
Hinweis:
Vor PHP 8.4.0 war es nicht erlaubt, Fibers während der Ausführung eines
Objekt-Destruktors zu
schalten.
Beispiel #1 Grundlegende Verwendung
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Der Wert für die Wiederaufnahme der Fiber: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Der Wert vom Unterbrechen der Fiber: ", $value, PHP_EOL;
$fiber->resume('test');
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Der Wert vom Unterbrechen der Fiber: fiber
Der Wert für die Wiederaufnahme der Fiber: test