Aperçu des fibres
(PHP 8 >= 8.1.0)
Les fibres représentent des fonctions interruptibles sur toute la pile. Les fibres peuvent être suspendues à n'importe quel endroit de la pile d'appels,
en interrompant l'exécution à l'intérieur de la fibre jusqu'à ce que la fibre soit reprise ultérieurement.
Les fibres mettent en pause l'ensemble de la pile d'exécution, de sorte que l'appelant direct de la fonction n'a pas besoin de modifier la façon dont il
invoque la fonction.
L'exécution peut être interrompue n'importe où dans la pile d'appels en utilisant Fiber::suspend()
(c'est-à-dire que l'appel à Fiber::suspend() peut se trouver dans une fonction profondément imbriquée
ou ne pas exister du tout).
Contrairement aux Generator n'ayant pas de pile, chaque Fiber possède sa propre pile d'appels,
ce qui leur permet d'être mises en pause dans des appels de fonctions profondément imbriquées. Une fonction déclarant un point d'interruption
(c'est-à-dire appelant Fiber::suspend()) n'a pas besoin de changer son type de retour, contrairement à une fonction utilisant
yield
qui doit retourner une instance de Generator.
Les fibres peuvent être suspendues dans n'importe quel appel de fonction, y compris celles appelées à l'intérieur de la VM PHP, comme les fonctions
fournies à array_map() ou les méthodes appelées par foreach
sur un objet
Iterator.
Une fois suspendue, l'exécution de la fibre peut être reprise avec n'importe quelle valeur en utilisant Fiber::resume()
ou en lançant une exception dans la fibre à l'aide de Fiber::throw(). La valeur est renvoyée
(ou l'exception lancée) par Fiber::suspend().
Note:
Avant PHP 8.4.0, le changement de fibres pendant l'exécution d'un
destructeur d'objet n'était pas
autorisé.
Exemple #1 Utilisation de base
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Valeur utilisée pour reprendre la fibre: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Valeur de la suspension de la fibre: ", $value, PHP_EOL;
$fiber->resume('test');
?>
L'exemple ci-dessus va afficher :
Valeur de la suspension de la fibre: fiber
Valeur utilisée pour reprendre la fibre: test