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 2Le 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: helloLes 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.
Défi
FacileConstruisons 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 classeTaskRunnerqui 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(): boolqui indique si le fiber s'est terminé
- 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 au fiber.Créez un
TaskRunneravec le nom de tâche fourni, puis utilisezcreateTask()pour définir une tâche qui :- Se suspend d'abord avec la chaîne de caractères
"Waiting for input" - Reçoit une valeur lorsqu'elle est reprise
- 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.- Se suspend d'abord avec la chaîne de caractères
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
?>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