Fibers — это новая возможность PHP 8.1+, предоставляющая легковесные корутины для управления выполнением кода без многопоточности. Рассмотрим детально:
$fiber = new Fiber(function(): void {
echo "Fiber start\n";
Fiber::suspend();
echo "Fiber end\n";
});
echo "Before start\n";
$fiber->start(); // Выведет "Fiber start"
echo "After start\n";
$fiber->resume(); // Выведет "Fiber end"
echo "After resume\n";
Вывод:
Before start
Fiber start
After start
Fiber end
After resume
$fiber = new Fiber(function($param): string {
$value = Fiber::suspend($param . ' processed');
return $value . ' returned';
});
$initial = $fiber->start('input'); // Приостановка после suspend
echo $initial; // "input processed"
$final = $fiber->resume('new'); // Возобновление с передачей 'new'
echo $final; // "new returned"
class Scheduler {
private array $fibers = [];
public function add(Fiber $fiber): void {
$this->fibers[] = $fiber;
}
public function run(): void {
while (!empty($this->fibers)) {
$fiber = array_shift($this->fibers);
if (!$fiber->isTerminated()) {
$this->add($fiber);
$fiber->resume();
}
}
}
}
$scheduler = new Scheduler();
$fiber1 = new Fiber(function() {
echo "Task 1 start\n";
Fiber::suspend();
echo "Task 1 end\n";
});
$fiber2 = new Fiber(function() {
echo "Task 2 start\n";
Fiber::suspend();
echo "Task 2 end\n";
});
$scheduler->add($fiber1);
$scheduler->add($fiber2);
$scheduler->run();
try {
$fiber = new Fiber(function(): void {
throw new Exception('Fiber error');
});
$fiber->start();
} catch (Exception $e) {
echo "Caught: " . $e->getMessage();
}
Особенность | Fibers | Генераторы | Многопоточность |
---|---|---|---|
Контекст выполнения | Полный стек | Только yield | Полный стек |
Параллелизм | Кооперативный | Кооперативный | Истинный |
Потребление памяти | Низкое | Очень низкое | Высокое |
Сложность | Средняя | Низкая | Высокая |
Fibers в PHP — это:
Для реальных проектов рекомендуется использовать Fibers в сочетании с существующими асинхронными библиотеками, а не реализовывать свой планировщик. Это особенно полезно для: