Fibers

Ü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: Aufgrund der derzeitigen Beschränkungen ist es nicht möglich, Fibers im Destruktor eines Objekts 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 
To Top