Fibers · PHP Manual
Огляд файберів
Файбери (Fiber) - це повноцінні функції з власним стеком, які можна переривати. Файбер можна призупинити з будь-якого місця стеку викликів: виконання всередині файбера зупиняється, доки файбер не відновлять пізніше.
Файбер призупиняє весь стек виконання, тому безпосередньому викликачу функції не потрібно міняти спосіб її виклику.
Виконання можна перервати в будь-якому місці стеку викликів за допомогою 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 перемикання файберів під час виконання деструктора обʼєкта було заборонено.
Приклад: базове використання
<?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');
?>
Результат виконання цього прикладу:
Value from fiber suspending: fiber
Value used to resume fiber: test
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.