Menu
Coddy logo textTech

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.

Fibers son una característica de PHP 8.1 que permite la ejecución de código interrumpible. A diferencia de las funciones regulares 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 una fibra pasando un callable a la clase Fiber, luego 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 2

La fibra se ejecuta hasta que llega a Fiber::suspend(), entonces 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 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: hello

Los Fibers son la base de los frameworks de PHP asíncronos. Aunque no los usarás directamente en la mayoría de las aplicaciones, entenderlos ayuda al trabajar con librerías asíncronas que manejan operaciones concurrentes como peticiones HTTP o consultas a bases de datos sin bloqueo.

challenge icon

Desafío

Fácil

Construyamos un programador de tareas que demuestre cómo los fibers pueden pausar y reanudar la ejecución mientras pasan datos entre el fiber y el código principal. Crearás un sistema donde las tareas pueden ser interrumpidas, permitiendo que ocurra otro trabajo en el medio.

Organizarás tu código en dos archivos:

  • TaskRunner.php — Crea una clase TaskRunner que envuelva la funcionalidad de fiber 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 utilizando la promoción de 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 el fiber y devuelva cualquier valor con el que el fiber se suspenda (o el valor de retorno final)
    • Tener un método continue(mixed $value) que reanude el fiber con el valor dado y devuelva el siguiente valor suspendido (o el valor de retorno final)
    • Tener un método isFinished(): bool que devuelva si el fiber ha terminado
  • main.php — Incluye el archivo TaskRunner. Recibirás dos entradas: un nombre de tarea y un mensaje para enviar al fiber.

    Crea un TaskRunner con el nombre de tarea dado, luego usa createTask() para definir una tarea que:

    1. Primero se suspenda con el string "Waiting for input"
    2. Reciba un valor cuando se reanude
    3. Devuelva "Completed: [received value]"

    Inicia la tarea e imprime lo que devuelve cuando se suspende por primera vez. Luego imprime "Processing..." para mostrar el trabajo que ocurre entre las pausas del fiber. Finalmente, continúa el fiber pasando el mensaje de entrada e imprime el resultado final.

Este desafío muestra cómo los fibers permiten la multitarea cooperativa: tu tarea se pausa a sí misma en un punto conveniente, el código principal realiza otro trabajo y luego reanuda la tarea con nuevos datos. El fiber mantiene su estado en todo momento, retomando exactamente donde se quedó.

Hoja de referencia

Los Fibers permiten la ejecución de código interrumpible en PHP 8.1+. A diferencia de las funciones regulares, un fiber puede pausarse a mitad de la ejecución y reanudarse más tarde manteniendo su estado.

Crea un fiber pasando un callable a la clase Fiber e 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();

El fiber se ejecuta hasta Fiber::suspend(), luego el control vuelve al código principal. Llama a resume() para continuar la ejecución desde donde se pausó.

Los Fibers pueden pasar valores al suspender y reanudar:

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

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

Métodos clave:

  • start() — comienza la ejecución del fiber
  • Fiber::suspend($value) — pausa la ejecución y devuelve un valor al llamador
  • resume($value) — continúa la ejecución y pasa un valor al fiber
  • isTerminated() — comprueba si el fiber ha finalizado

Pruébalo tú mismo

<?php

require_once 'TaskRunner.php';

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

// TODO: Crear un TaskRunner con el nombre de tarea dado

// TODO: Usar createTask() para definir una tarea que:
// 1. Primero se suspenda con la cadena "Waiting for input"
// 2. Reciba un valor cuando se reanude
// 3. Devuelva "Completed: [received value]"

// TODO: Iniciar la tarea e imprimir lo que devuelve cuando se suspende por primera vez

// TODO: Imprimir "Processing..." para mostrar el trabajo que ocurre entre las pausas de la fibra

// TODO: Continuar la fibra pasando la entrada del mensaje

// TODO: Imprimir el resultado final

?>
quiz iconPonte a prueba

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