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 classiques qui s'exécutent du début à la fin, une fiber peut s'interrompre en cours d'exécution et reprendre plus tard, tout en conservant son état entre les 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 2La fibre s'exécute jusqu'à ce qu'elle atteigne Fiber::suspend(), puis le contrôle revient au code principal. Appeler resume() poursuit l'exécution là où elle s'est 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: helloLes Fibers sont le fondement des frameworks PHP asynchrones. Bien que vous ne les utilisiez pas directement dans la plupart des applications, les comprendre aide lors de l'utilisation de bibliothèques asynchrones qui gèrent des opérations concurrentes comme des requêtes HTTP ou des requêtes de base de données sans blocage.
Défi
FacileConstruisons un planificateur de tâches qui démontre comment les fibers peuvent mettre en pause et reprendre l'exécution tout en échangeant des données entre la fiber et le code principal. Vous allez créer un système où les tâches peuvent être interrompues, permettant à d'autres travaux de s'effectuer entre-temps.
Vous organiserez votre code sur deux fichiers :
TaskRunner.php— Créez une classeTaskRunnerqui enveloppe les fonctionnalités de fiber pour l'exécution de 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 une nouvelle Fiber avec le callable donné et la stocke - Avoir une méthode
start()qui démarre la fiber et retourne la valeur avec laquelle la fiber se suspend (ou la valeur de retour finale) - Avoir une méthode
continue(mixed $value)qui reprend la fiber avec la valeur donnée et retourne la valeur de suspension suivante (ou la valeur de retour finale) - Avoir une méthode
isFinished(): boolqui indique si la fiber est terminée
- Avoir une propriété privée pour stocker une instance de
main.php— Incluez le fichier TaskRunner. Vous recevrez deux entrées : un nom de tâche et un message à envoyer à la fiber.Créez un
TaskRunneravec le nom de tâche donné, puis utilisezcreateTask()pour définir une tâche qui :- Se suspend d'abord avec la chaîne
"Waiting for input" - Reçoit une valeur lors de sa reprise
- Retourne
"Completed: [received value]"
Démarrez la tâche et affichez ce qu'elle retourne lors de sa première suspension. Affichez ensuite
"Processing..."pour montrer le travail effectué entre les pauses de la fiber. Enfin, continuez la fiber en lui passant le message d'entrée, et affichez le résultat final.- Se suspend d'abord avec la chaîne
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 point opportun, le code principal effectue d'autres travaux, puis reprend la tâche avec de nouvelles données. La fiber conserve son état tout au long du processus, reprenant exactement là où elle s'était arrêtée.
Aide-mémoire
Les Fibers permettent l'exécution de code interruptible en PHP 8.1+. Contrairement aux fonctions classiques, une fiber peut s'interrompre en cours d'exécution et reprendre plus tard tout en conservant son état.
Créez une fiber en passant un callable à la classe Fiber et démarrez-la 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();
La fiber s'exécute jusqu'à Fiber::suspend(), puis le contrôle revient au code principal. Appelez resume() pour continuer l'exécution là où elle s'est arrêtée.
Les Fibers peuvent 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();
$result = $fiber->resume("hello");
Méthodes clés :
start()— commence l'exécution de la fiberFiber::suspend($value)— suspend l'exécution et renvoie une valeur à l'appelantresume($value)— continue l'exécution et transmet une valeur à la fiberisTerminated()— vérifie si la fiber est terminée
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. Se suspend d'abord avec la chaîne "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 effectué entre les pauses de la fibre
// TODO: Continuer la fibre en passant l'entrée message
// TODO: Afficher le résultat final
?>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
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie