Menu
Coddy logo textTech

Fibers (PHP 8.1)

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 60 de 91.

Fibers são um recurso do PHP 8.1 que permite a execução de código interrompível. Ao contrário das funções normais que são executadas do início ao fim, uma fiber pode pausar a si mesma no meio da execução e retomar mais tarde, mantendo seu estado `between` as pausas.

Crie uma fiber passando um callable para a classe Fiber e, em seguida, inicie-a com start():

<?php
$fiber = new Fiber(function(): void {
    echo "Step 1\n";
    Fiber::suspend();
    echo "Step 2\n";
});

$fiber->start();
echo "Between steps\n";
$fiber->resume();

Saída:

Step 1
Between steps
Step 2

A fiber executa até atingir Fiber::suspend(), então o controle retorna ao código principal. Chamar resume() continua a execução de onde ela foi pausada.

As Fibers também podem passar valores ao suspender e retomar:

<?php
$fiber = new Fiber(function(): string {
    $value = Fiber::suspend("paused");
    return "Received: $value";
});

$suspended = $fiber->start();
echo "$suspended\n";

$result = $fiber->resume("hello");
echo $result;

Saída:

paused
Received: hello

Fibers são a base para frameworks PHP assíncronos. Embora você não vá usá-los diretamente na maioria das aplicações, entendê-los ajuda ao trabalhar com bibliotecas assíncronas que lidam com operações concorrentes, como requisições HTTP ou consultas ao banco de dados, sem bloquear.

challenge icon

Desafio

Fácil

Vamos construir um agendador de tarefas que demonstra como fibers podem pausar e retomar a execução enquanto passam dados entre o fiber e o código principal. Você criará um sistema onde tarefas podem ser interrompidas, permitindo que outro trabalho aconteça no intervalo.

Você organizará seu código em dois arquivos:

  • TaskRunner.php — Crie uma classe TaskRunner que envolve a funcionalidade de fiber para executar tarefas. A classe deve:
    • Ter uma propriedade privada para armazenar uma instância de Fiber
    • Aceitar um nome de tarefa (string) em seu construtor usando promoção de propriedade de construtor
    • Ter um método createTask(callable $task) que cria um novo Fiber com o callable fornecido e o armazena
    • Ter um método start() que inicia o fiber e retorna qualquer valor com o qual o fiber suspende (ou o valor de retorno final)
    • Ter um método continue(mixed $value) que retoma o fiber com o valor fornecido e retorna o próximo valor suspenso (ou valor de retorno final)
    • Ter um método isFinished(): bool que retorna se o fiber foi terminado
  • main.php — Inclua o arquivo TaskRunner. Você receberá duas entradas: um nome de tarefa e uma mensagem para enviar ao fiber.

    Crie um TaskRunner com o nome de tarefa fornecido, depois use createTask() para definir uma tarefa que:

    1. Primeiro suspende com a string "Waiting for input"
    2. Recebe um valor quando retomada
    3. Retorna "Completed: [received value]"

    Inicie a tarefa e imprima o que ela retorna quando suspende pela primeira vez. Em seguida, imprima "Processing..." para mostrar o trabalho acontecendo entre as pausas do fiber. Por fim, continue o fiber passando a mensagem de entrada e imprima o resultado final.

Este desafio mostra como fibers permitem multitarefa cooperativa — sua tarefa pausa a si mesma em um ponto conveniente, o código principal realiza outro trabalho e depois retoma a tarefa com novos dados. O fiber mantém seu estado por completo, continuando exatamente de onde parou.

Experimente você mesmo

<?php

require_once 'TaskRunner.php';

// Lê as entradas
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Crie um TaskRunner com o nome da tarefa fornecido

// TODO: Use createTask() para definir uma tarefa que:
// 1. First suspends with the string "Waiting for input"
// 2. Recebe um valor quando retomada
// 3. Retorna "Completed: [received value]"

// TODO: Inicie a tarefa e imprima o que ela retorna quando suspende pela primeira vez

// TODO: Imprima "Processing..." para mostrar o trabalho acontecendo entre as pausas da fiber

// TODO: Continue a fiber passando a entrada da mensagem

// TODO: Imprima o resultado final

?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos