Menu
Coddy logo textTech

Fibers (PHP 8.1)

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 60 sur 91.

Les Fibers sont une fonctionnalité de PHP 8.1 qui permet l'exécution de code interruptible. Contrairement aux fonctions ordinaires qui s'exécutent du début à la fin, une fiber peut s'interrompre en cours d'exécution et reprendre plus tard, en conservant son état between deux pauses.

Créez un fiber en passant un callable à la classe Fiber, puis démarrez-le avec 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();

Sortie :

Step 1
Between steps
Step 2

Le fiber s'exécute jusqu'à ce qu'il atteigne Fiber::suspend(), puis le contrôle revient au code principal. L'appel à resume() poursuit l'exécution là où elle s'était arrêtée.

Les Fibers peuvent également transmettre des valeurs lors de la suspension et de la reprise :

<?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;

Sortie :

paused
Received: hello

Les Fibers sont la base des frameworks PHP asynchrones. Bien que vous ne les utilisiez pas directement dans la plupart des applications, les comprendre vous aide lorsque vous travaillez avec des bibliothèques asynchrones qui gèrent des opérations concurrentes telles que des requêtes HTTP ou des requêtes de base de données sans blocage.

challenge icon

Défi

Facile

Construisons un planificateur de tâches qui montre comment les fibers peuvent suspendre et reprendre leur exécution tout en échangeant des données entre le fiber et le code principal. Vous allez créer un système où les tâches peuvent être interrompues, permettant à d'autres traitements d'avoir lieu entre-temps.

Vous organiserez votre code dans deux fichiers :

  • TaskRunner.php — Créez une classe TaskRunner qui enveloppe la fonctionnalité de fiber pour exécuter des tâches. La classe doit :
    • Avoir une propriété privée pour stocker une instance de Fiber
    • Accepter un nom de tâche (chaîne de caractères) dans son constructeur en utilisant la promotion de propriété de constructeur
    • Avoir une méthode createTask(callable $task) qui crée un nouveau Fiber avec le callable fourni et le stocke
    • Avoir une méthode start() qui démarre le fiber et renvoie la valeur avec laquelle le fiber se suspend (ou la valeur de retour finale)
    • Avoir une méthode continue(mixed $value) qui reprend le fiber avec la valeur fournie et renvoie la valeur suspendue suivante (ou la valeur de retour finale)
    • Avoir une méthode isFinished(): bool qui indique si le fiber s'est terminé
  • main.php — Incluez le fichier TaskRunner. Vous recevrez deux entrées : un nom de tâche et un message à envoyer au fiber.

    Créez un TaskRunner avec le nom de tâche fourni, puis utilisez createTask() pour définir une tâche qui :

    1. Se suspend d'abord avec la chaîne de caractères "Waiting for input"
    2. Reçoit une valeur lorsqu'elle est reprise
    3. Renvoie "Completed: [received value]"

    Démarrez la tâche et affichez ce qu'elle renvoie lorsqu'elle se suspend pour la première fois. Affichez ensuite "Processing..." pour montrer le traitement effectué entre les pauses du fiber. Enfin, poursuivez le fiber en lui passant le message reçu en entrée, et affichez le résultat final.

Ce défi montre comment les fibers permettent le multitâche coopératif — votre tâche se met en pause d'elle-même à un moment opportun, le code principal effectue un autre traitement, puis reprend la tâche avec de nouvelles données. Le fiber conserve son état tout au long du processus, reprenant exactement là où il s'était arrêté.

Essayez vous-même

<?php

require_once 'TaskRunner.php';

// Lire les entrées
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Créer un TaskRunner avec le nom de tâche donné

// TODO: Utiliser createTask() pour définir une tâche qui :
// 1. First suspends with the string "Waiting for input"
// 2. Reçoit une valeur lors de la reprise
// 3. Retourne "Completed: [received value]"

// TODO: Démarrer la tâche et afficher ce qu'elle retourne lors de sa première suspension

// TODO: Afficher "Processing..." pour montrer le travail en cours entre les pauses de la fibre

// TODO: Continuer la fibre en passant le message en entrée

// TODO: Afficher le résultat final

?>
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet