PHP

Немного о Fiber

Fiber в PHP 8.1

Определение

В официальной документации дано следующее определение:

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

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 отражены состояния файбера во время определенного этапа выполнения.

Подробнее :

dev-notes.ru

Авторизуйтесь, что бы оставить комментарий!