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 2A 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: 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 ao banco de dados, sem bloquear.
Desafio
FácilVamos 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 classeTaskRunnerque 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(): 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 de tarefa fornecido, depois 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 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
?>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