Fibers (PHP 8.1)
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 60 de 91.
Los Fibers son una característica de PHP 8.1 que permite la ejecución de código interrumpible. A diferencia de las funciones normales que se ejecutan de principio a fin, un fiber puede pausarse a sí mismo a mitad de la ejecución y reanudarse más tarde, manteniendo su estado entre pausas.
Crea un fiber pasando un callable a la clase Fiber, después inícialo con 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();
Salida:
Step 1
Between steps
Step 2El fiber se ejecuta hasta que alcanza Fiber::suspend(), después el control vuelve al código principal. Llamar a resume() continúa la ejecución desde donde se pausó.
Las fibras también pueden pasar valores al suspenderse y reanudarse:
<?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;
Salida:
paused
Received: helloLas Fibers son la base para los frameworks asíncronos de PHP. Aunque no las usarás directamente en la mayoría de las aplicaciones, entenderlas ayuda al trabajar con bibliotecas asíncronas que manejan operaciones concurrentes como peticiones HTTP o consultas a bases de datos sin bloquear.
Desafío
FácilConstruyamos un programador de tareas que demuestre cómo las fibras pueden pausar y reanudar la ejecución mientras transfieren datos entre la fibra y el código principal. Crearás un sistema donde las tareas se pueden interrumpir, permitiendo que ocurra otro trabajo de por medio.
Organizarás tu código en dos archivos:
TaskRunner.php— Crea una claseTaskRunnerque envuelva la funcionalidad de fibras para ejecutar tareas. La clase debe:- Tener una propiedad privada para almacenar una instancia de
Fiber - Aceptar un nombre de tarea (string) en su constructor usando promoción de propiedades en el constructor
- Tener un método
createTask(callable $task)que cree un nuevo Fiber con el callable dado y lo almacene - Tener un método
start()que inicie la fibra y devuelva cualquier valor con el que se suspenda la fibra (o el valor de retorno final) - Tener un método
continue(mixed $value)que reanude la fibra con el valor dado y devuelva el siguiente valor suspendido (o el valor de retorno final) - Tener un método
isFinished(): boolque devuelva si la fibra ha terminado
- Tener una propiedad privada para almacenar una instancia de
main.php— Incluye el archivo TaskRunner. Recibirás dos entradas: un nombre de tarea y un mensaje para enviar a la fibra.Crea un
TaskRunnercon el nombre de tarea dado, después usacreateTask()para definir una tarea que:- Primero se suspenda con la cadena
"Waiting for input" - Reciba un valor cuando se reanude
- Devuelva
"Completed: [received value]"
Inicia la tarea e imprime lo que devuelve cuando se suspende por primera vez. Después imprime
"Processing..."para mostrar el trabajo que ocurre entre las pausas de la fibra. Finalmente, reanuda la fibra pasando el mensaje de entrada e imprime el resultado final.- Primero se suspenda con la cadena
Este desafío muestra cómo las fibras permiten la multitarea cooperativa: tu tarea se pausa a sí misma en un punto conveniente, el código principal realiza otro trabajo y después reanuda la tarea con nuevos datos. La fibra mantiene su estado en todo momento, continuando exactamente donde se quedó.
Pruébalo tú mismo
<?php
require_once 'TaskRunner.php';
// Lee las entradas
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Crea un TaskRunner con el nombre de tarea dado
// TODO: Usa createTask() para definir una tarea que:
// 1. First suspends with the string "Waiting for input"
// 2. Recibe un valor cuando se reanuda
// 3. Devuelve "Completed: [received value]"
// TODO: Inicia la tarea e imprime lo que devuelve cuando se suspende por primera vez
// TODO: Imprime "Processing..." para mostrar el trabajo que ocurre entre las pausas del fiber
// TODO: Continúa el fiber pasando la entrada del mensaje
// TODO: Imprime el resultado final
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy