Немного о Fiber
Определение
В официальной документации дано следующее определение:
Файберы представляют собой прерываемые функции полного цикла. Файберы могут быть приостановлены из любого места цикла, приостанавливая выполнение в файбере до тех пор, пока файбер не будет возобновлён в будущем.
Fiber были добавлены в PHP версии 8.1. Класс помечен как финальный. Объект имеет несколько состояний и 2 метода: start и resume. Файберы можно создавать внутри других файберов. Файберы могут применяться для организации http запросов, коннектов и тд. Не большой псевдокод работы файберов для multi_curl: https://www.php.net/manual/ru/language.fibers.php#127125
Пример
Проверяем валидность email адресов в Fiber.
<?php
final class EmailValidator
{
public function isValid(string $email): bool
{
return (bool)rand(0, 1);
}
}
final class EmailValidationDTO
{
public function __construct(
public readonly string $email,
public readonly bool $result
)
{
}
}
$emailValidator = new EmailValidator();
$fiber = new Fiber(function (array $emails) use ($emailValidator): void {
foreach ($emails as $email) {
Fiber::suspend(new EmailValidationDTO($email, $emailValidator->isValid($email)));
}
});
$fiberStatesBeforeStart = [
'$fiber->isRunning()' => $fiber->isRunning(), // false
'$fiber->isTerminated()' => $fiber->isTerminated(), // false
'$fiber->isStarted()' => $fiber->isStarted(), // false
'$fiber->isSuspended()' => $fiber->isSuspended(), // false
];
try {
/** @var EmailValidationDTO $value */
$value = $fiber->start([
'dev0@backloger.ru',
'dev1@backloger.ru',
'dev2@backloger.ru',
'dev3@backloger.ru',
'dev4@backloger.ru',
]);
$fiberStatesAfterStart = [
'$fiber->isRunning()' => $fiber->isRunning(), // false
'$fiber->isTerminated()' => $fiber->isTerminated(), // false
'$fiber->isStarted()' => $fiber->isStarted(), // true
'$fiber->isSuspended()' => $fiber->isSuspended(), // true
];
while (!$fiber->isTerminated()) {
$result = $value->result ? 'success' : 'fail';
echo "Email {$value->email} validation result: {$result}" . PHP_EOL;
/** @var EmailValidationDTO $value */
$value = $fiber->resume();
}
} catch (Throwable $e) {
$err = 1;
}
$fiberStatesAfterTerminated = [
'$fiber->isRunning()' => $fiber->isRunning(), // false
'$fiber->isTerminated()' => $fiber->isTerminated(), // true
'$fiber->isStarted()' => $fiber->isStarted(), // true
'$fiber->isSuspended()' => $fiber->isSuspended(), // false
];
//Email dev0@backloger.ru validation result: success
//Email dev1@backloger.ru validation result: success
//Email dev2@backloger.ru validation result: success
//Email dev3@backloger.ru validation result: fail
//Email dev4@backloger.ru validation result: fail
//Email dev5@backloger.ru validation result: success
В переменных $fiberStatesBeforeStart , $fiberStatesAfterStart , $fiberStatesAfterTerminated отражены состояния файбера во время определенного этапа выполнения.
Подробнее :