Fiber (PHP 8.1) - функція з власним стеком, яку можна призупинити посередині й пізніше відновити з того самого місця. Це кооперативна багатозадачність: файбер сам вирішує, коли віддати керування.
$fiber = new Fiber(function (string $first): string {
$second = Fiber::suspend("отримав: {$first}"); // пауза, повертаємо значення
return "завершено з {$second}";
});
$value = $fiber->start('A'); // 'отримав: A'
$fiber->resume('B'); // продовжує після suspend
echo $fiber->getReturn(); // 'завершено з B'
Відмінність від потоків:
- Потоки виконуються паралельно (на різних ядрах чи з перемиканням ОС у будь-який момент). Потрібна синхронізація доступу до спільних даних.
- Файбери виконуються по черзі в одному потоці. Лише один файбер працює в кожен момент, перемикання відбувається тільки в
suspend()/resume(). Гонок даних у класичному розумінні немає.
Тобто файбери не роблять обчислення швидшими й не використовують кілька ядер.
Навіщо вони: для асинхронного вводу-виводу. Поки один файбер чекає відповідь мережі, цикл подій (event loop) запускає інший. Головне - файбер дозволяє писати асинхронний код як звичайний синхронний, без колбеків і промісів: функція глибоко в стеку може призупинитися, не змінюючи сигнатур викликачів.
Хто використовує: Revolt (event loop), AMPHP v3, ReactPHP-адаптери. Прикладному коду рідко потрібно створювати файбери напряму - це будівельний блок для бібліотек.
Застереження: звичайні блокуючі функції (PDO, file_get_contents, sleep) блокують увесь процес разом з усіма файберами. Асинхронність працює лише з неблокуючими драйверами з екосистеми event loop.