Fibras (PHP 8.1)
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 60 de 91.
Fibers es 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 durante la ejecución y reanudarse más tarde, manteniendo su estado entre las pausas.
Crea una fibra pasando un elemento invocable a la clase Fiber y después iníciala 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 2La fibra se ejecuta hasta que encuentra Fiber::suspend(); después, el control vuelve al código principal. Llamar a resume() continúa la ejecución desde donde se pausó.
Los fibers también pueden pasar valores al pausar y reanudar:
<?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: helloLos fibers son la base de los frameworks de PHP asíncronos. Aunque no los usarás directamente en la mayoría de las aplicaciones, comprenderlos ayuda al trabajar con bibliotecas asíncronas que gestionan operaciones concurrentes, como solicitudes HTTP o consultas a bases de datos, sin bloquear.
Desafío
FácilConstruyamos un planificador de tareas que demuestre cómo las fibras pueden pausar y reanudar la ejecución mientras pasan datos entre la fibra y el código principal. Crearás un sistema en el que las tareas puedan interrumpirse, permitiendo que otro trabajo se realice entre medias.
Organizarás tu código en dos archivos:
TaskRunner.php: Crea una claseTaskRunnerque encapsule la funcionalidad de las fibras para ejecutar tareas. La clase debe:- Tener una propiedad privada para almacenar una instancia de
Fiber - Aceptar un nombre de tarea (cadena) en su constructor mediante la promoción del constructor
- Tener un método
createTask(callable $task)que cree una nueva Fiber con el callable proporcionado y la almacene - Tener un método
start()que inicie la fibra y devuelva cualquier valor con el que la fibra se suspenda (o el valor de retorno final) - Tener un método
continue(mixed $value)que reanude la fibra con el valor proporcionado 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 de TaskRunner. Recibirás dos entradas: un nombre de tarea y un mensaje para enviar a la fibra.Crea un
TaskRunnercon el nombre de tarea proporcionado y, después, usacreateTask()para definir una tarea que:- Primero se suspenda con la cadena
"Waiting for input" - Reciba un valor al reanudarse
- 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 se realiza entre las pausas de la fibra. Por último, continúa la fibra pasando la entrada del mensaje 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 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 durante todo el proceso y continúa exactamente donde se había detenido.
Pruébalo tú mismo
<?php
require_once 'TaskRunner.php';
// Leer 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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online