Обзор файберов
(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().
Замечание:
До версии PHP 8.4.0 переключать файбер в деструкторе объекта было невозможно.
Пример #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