Descripción general de Fibers
(PHP 8 >= 8.1.0)
Los Fibers representan funciones de pila completa e interrumpibles. Los Fibers pueden suspenderse desde cualquier lugar en la pila de llamadas,
pausando su ejecución dentro del Fiber hasta que se reanude más tarde.
Los Fibers pausan toda la pila de ejecución, por lo que el llamador directo de la función no necesita cambiar la forma
en que invoca la función
La ejecución puede interrumpirse en cualquier lugar de la pila de llamadas utilizando Fiber::suspend()
(es decir, la llamada a Fiber::suspend() puede estar en una función profundamente anidada o incluso no
existir en absoluto)
A diferencia de los Generators sin pila, cada Fiber tiene su propia pila de llamadas,
lo que permite que se pausen dentro de llamadas a funciones profundamente anidadas. Una función que declara un punto de interrupción
(es decir, que llama a Fiber::suspend()) no necesita cambiar su tipo de retorno, a diferencia de una función que utiliza
yield
y debe devolver una instancia de Generator.
Los Fibers pueden suspenderse en cualquier llamada a función, incluidas aquellas realizadas desde la Máquina Virtual de PHP, como las funciones
proporcionadas a array_map() o los métodos llamados por foreach
en un
objeto Iterator.
Una vez suspendido, la ejecución del Fiber puede reanudarse con cualquier valor utilizando Fiber::resume() o lanzando una excepción en el Fiber utilizando Fiber::throw(). El valor se devuelve (o la excepción se lanza) desde Fiber::suspend()
Once suspended, execution of the fiber may be resumed with any value using Fiber::resume()
or by throwing an exception into the fiber using Fiber::throw(). The value is returned
(or exception thrown) from Fiber::suspend().
Nota:
Antes de PHP 8.4.0, no se permitía cambiar Fibers durante la ejecución de un
destructor
de objeto.
Ejemplo #1 Uso básico
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Valor utilizado para reanudar el Fiber: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Valor del Fiber al suspenderse: ", $value, PHP_EOL;
$fiber->resume('test');
?>
El ejemplo anterior mostrará :
Valor del Fiber al suspenderse: fiber
Valor utilizado para reanudar el Fiber: test