DEV Community

Raziel Rodrigues
Raziel Rodrigues

Posted on • Edited on

Fibers - adicionando super poderes ao PHP

O assunto de hoje é Fibers. Neste artigo, vou explicar o que fiz e fornecer o link para o repositório com todo o conteúdo.

Fibers

Em resumo, Fibers dão o poder de controlarmos a execução da função. Ou seja, suponha que nossa função tenha um algoritmo de 40 linhas. Dentro de uma função comum, executaríamos as 40 linhas diretamente. Com as fibers, podemos executar primeiro 20 linhas, suspender a execução, executar outra parte do código, e depois da outra parte ter sido finalizada, continuar a execução da função. Lembra um pouco o async/await do JavaScript, mas é algo diferente. No entanto, é um passo para o PHP se tornar cada vez mais assíncrono de forma nativa (sem libs como ReactPHP). As Fibers são uma nova classe introduzida no PHP 8, com os seguintes métodos disponíveis:

  • Fiber::__construct
  • Fiber::start
  • Fiber::suspend
  • Fiber::resume
  • Fiber::getCurrent
  • Fiber::getReturn
  • Fiber::throw
  • Fiber::isStarted
  • Fiber::isSuspended
  • Fiber::isRunning
  • Fiber::isTerminated

A Pilha de Execução ou Callstack

Com as fibers, a função passa a ter sua própria callstack, ou seja, ela não é executada da mesma forma que uma função normal. Para entender melhor, observe essa imagem que está na RFC dessa feature:

Fibers RFC

Dessa forma, vemos que o fluxo da função muda, já não sendo o mesmo de uma função normal, que é executada diretamente e depois que ela foi executada, a próxima função é chamada. Com as fibers, podemos parar a execução de uma função no meio e depois voltar.

Vamos ao Código

Preparei um exemplo muito simples, que basicamente simula uma pessoa que está trabalhando, representando oito horas de trabalho via Fibers.

$horas = 9;
$pessoaQueTrabalha = new Fiber(function ($horas) {
    echo "\nInicio do trabalho às: {$horas}";
    Fiber::suspend();
    echo "\nVoltou a trabalhar";
    return "O trabalhador se sente cansado!";
});

$emprego = new Fiber(function ($pessoaQueTrabalha, $horas) {
    $pessoaQueTrabalha->start($horas);

    if ($pessoaQueTrabalha->isSuspended()) {
        echo "\nPessoa fez uma pausa";
    }

    for ($i = 0; $i <= 8; $i++) {
        $horas++;
        if ($horas == 12) {
            $pessoaQueTrabalha->resume();
        }
    }

    if ($pessoaQueTrabalha->isTerminated()) {
        echo "\nPessoa terminou o trabalho às: {$horas}";
        echo "\nSentimentos da pessoa: {$pessoaQueTrabalha->getReturn()}";
    }
});

$emprego->start($pessoaQueTrabalha, $horas);
Enter fullscreen mode Exit fullscreen mode

Assim que quando tu executar o código vai ser possivel ver o controle de fluxo da função.

Top comments (0)