Fibers

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().

Note: Devido às limitações atuais, não é possível trocar Fibers no destruidor de um objeto.

Example #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