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 2A 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: helloFibers 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.
Desafio
FácilVamos 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 classeTaskRunnerque 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(): boolque retorna se o fiber foi terminado
- Ter uma propriedade privada para armazenar uma instância de
main.php— Inclua o arquivo TaskRunner. Você receberá duas entradas: um nome de tarefa e uma mensagem para enviar ao fiber.Crie um
TaskRunnercom o nome da tarefa fornecido, então usecreateTask()para definir uma tarefa que:- Primeiro suspende com a string
"Waiting for input" - Recebe um valor quando retomada
- 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.- Primeiro suspende com a string
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 fiberFiber::suspend($value)— pausa a execução e retorna um valor para quem a chamouresume($value)— continua a execução e passa um valor para a fiberisTerminated()— 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
?>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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy