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

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

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

В отличие от генераторов без стека , у каждого волокна есть собственный стек вызовов, что позволяет приостанавливать их работу внутри глубоко вложенных вызовов функций. Функция, объявляющая точку прерывания (то есть вызывающая 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 used to resume fiber: ", $value, PHP_EOL;
});

$value = $fiber->start();

echo "Value from fiber suspending: ", $value, PHP_EOL;

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

Приведенный выше пример выведет:

Ценность подвешивания волокна: волокно
Значение, используемое для возобновления оптоволокна: тест