Visão geral de Fibers
(PHP 8 >= 8.1.0)
Fibers representam funções interrompíveis de pilha completa. Fibers podem ser suspensas de qualquer lugar na pilha de chamadas,
pausando a execução dentro de Fiber até que Fiber seja retomada posteriormente.
Fibers pausam toda a pilha de execução, portanto, o chamador direto da função não precisa alterar a forma
como invoca a função.
A execução pode ser interrompida em qualquer lugar na pilha de chamadas usando Fiber::suspend()
(ou seja, a chamada para Fiber::suspend() pode estar em uma função profundamente aninhada ou nem
mesmo existir).
Ao contrário dos Generators, cada Fiber tem sua própria pilha de chamadas,
permitindo que sejam pausadas em chamadas de função profundamente aninhadas. Uma função que declara um ponto de interrupção
(isto é, chamando Fiber::suspend()) não precisa alterar seu tipo de retorno, ao contrário de uma função
que usa yield
, que deve retornar uma instância de Generator.
Fibers podem ser suspensas em qualquer chamada de função, incluindo aquelas chamadas de dentro da VM PHP, como funções
fornecidas para array_map() ou métodos chamados por foreach
em um
objeto Iterator.
Uma vez suspensa, a execução de Fiber pode ser retomada com qualquer valor usando Fiber::resume()
ou lançando uma exceção na Fiber usando Fiber::throw(). O valor é retornado
(ou exceção lançada) de Fiber::suspend().
Nota:
Antes do PHP 8.4.0, trocas de Fibers durante a execução de um
destrutor de objeto não eram
permitidas.
Exemplo #1 Uso básico
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Value used to resume fiber: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Value from fiber suspending: ", $value, PHP_EOL;
$fiber->resume('test');
?>
O exemplo acima produzirá:
Value from fiber suspending: fiber
Value used to resume fiber: test