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 regulares que executam do início ao fim, uma fiber pode pausar a si mesma no meio da execução e retomar mais tarde, mantendo seu estado entre as pausas.

Crie uma fiber passando um callable para a classe Fiber, então 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 para o código principal. Chamar resume() continua a execução de onde ela parou.

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 de banco de dados, sem bloqueio.

challenge icon

Desafio

Fácil

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

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

  • TaskRunner.php — Crie uma classe TaskRunner que encapsula 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 a promoção 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 suspenda (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 o 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 da tarefa fornecido, então 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 os fibers permitem o multitarefa cooperativo — sua tarefa pausa a si mesma em um ponto conveniente, o código principal realiza outro trabalho e, em seguida, retoma a tarefa com novos dados. O fiber mantém seu estado durante todo o processo, continuando exatamente de onde parou.

Folha de consulta

Fibers permitem a execução de código interrompível no PHP 8.1+. Ao contrário das funções regulares, uma fiber pode pausar no meio da execução e retomar mais tarde, mantendo seu estado.

Crie uma fiber passando um callable para a classe Fiber e 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();

A fiber executa até Fiber::suspend(), então o controle retorna ao código principal. Chame resume() para continuar a execução de onde ela parou.

Fibers podem passar valores ao suspender e retomar:

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

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

Métodos principais:

  • start() — inicia a execução da fiber
  • Fiber::suspend($value) — pausa a execução e retorna um valor para quem a chamou
  • resume($value) — continua a execução e passa um valor para a fiber
  • isTerminated() — verifica se a fiber terminou

Experimente você mesmo

<?php

require_once 'TaskRunner.php';

// Ler entradas
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

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

// TODO: Usar createTask() para definir uma tarefa que:
// 1. Primeiro suspenda com a string "Waiting for input"
// 2. Receba um valor quando for retomada
// 3. Retorne "Completed: [received value]"

// TODO: Iniciar a tarefa e imprimir o que ela retorna quando suspender pela primeira vez

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

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

// TODO: Imprimir 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