Fibers

Обзор файберов

(PHP 8 >= 8.1.0)

Файберы представляют собой прерываемые функции полного цикла. Файберы могут быть приостановлены из любого места цикла, приостанавливая выполнение в файбере до тех пор, пока файбер не будет возобновлён в будущем.

Файберы приостанавливают весь цикл выполнения, поэтому вызывающему функцию напрямую не нужно менять способ её вызова.

Выполнение может быть прервано в любом месте цикла с помощью метода Fiber::suspend() (то есть вызов Fiber::suspend() может находиться в глубоко вложенной функции или даже вообще не существовать).

В отличие от генераторов (Generator) без стека, у каждого объекта Fiber есть свой собственный стек вызовов, позволяющий приостанавливать их внутри глубоко вложенных вызовов функций. Функция, объявляющая точку прерывания (то есть вызов метода Fiber::suspend()), не должна изменять свой возвращаемый тип, в отличие от функции, использующей yield, который должен возвращать экземпляр Generator.

Файберы могут быть приостановлены при вызове любой функции, включая те, которые вызываются из виртуальной машины PHP, например, функции, предоставляемые array_map(), или методы, вызываемые foreach для объекта Iterator.

После приостановки выполнение файбера может быть возобновлено с любым значением с помощью метода Fiber::resume() или путём передачи исключения в файбер с помощью Fiber::throw(). Значение возвращается (или выбрасывается исключение) из метода Fiber::suspend().

Замечание: Из-за текущих ограничений невозможно переключать файбер в деструкторе объекта.

Пример #1 Простой пример

<?php
$fiber
= new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo
"Значение возобновлённого файбера: ", $value, PHP_EOL;
});

$value = $fiber->start();

echo
"Значение приостановленного файбера: ", $value, PHP_EOL;

$fiber->resume('test');
?>

Результат выполнения приведённого примера:

Значение приостановленного файбера: fiber
Значение возобновлённого файбера: test
add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top