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:
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);
Assim que quando tu executar o código vai ser possivel ver o controle de fluxo da função.
Top comments (0)