PHP 8.1 – Novos recursos que você precisa conhecer

O PHP continua a melhorar os recursos em sua base de código. As fibras do PHP aparecerão no PHP 8.1 ainda este ano, e esta é uma das adições importantes à linguagem. Eles abrirão novas possibilidades para um tipo de programação assíncrona (co-rotinas). O conceito de fibra refere-se principalmente ao fluxo leve de execução (também chamado de co-rotina). Eles são executados em paralelo, mas não são enviados diretamente para a CPU e, eventualmente, são processados ​​pelo próprio tempo de execução. Muitas das principais linguagens têm suas próprias maneiras de implementá-las, mas elas têm uma semelhança e é a seguinte: deixe o computador realizar duas ou mais tarefas simultaneamente e espere até que tudo esteja concluído.

A implementação de Fibers em PHP não é uma verdadeira computação assíncrona, como alguém pode pensar. Obviamente, o núcleo do PHP ainda será síncrono depois que as fibras forem introduzidas. Você pode imaginar que as fibras PHP são como mudar de um carro para outro.

Como funcionam as fibras?

Uma fibra é uma única classe final e é semelhante a threads em um programa de computador. Os threads são agendados pelo sistema operacional e não garante quando e em que ponto os threads são pausados ​​e retomados. As fibras são criadas, iniciadas, suspensas e encerradas pelo próprio programa e permite um controle preciso da execução do programa principal e da execução da fibra.

Depois de criar uma nova instância de Fiber com um chamável, nada acontecerá.
Até que você inicie o Fiber, o retorno de chamada não será executado como qualquer outro código PHP normal.

As fibras são assíncronas, mas apenas até você suspendê-las chamando
Fiber::suspend()dentro do retorno de chamada. QuandoFiber::suspend()
é chamada, a fibra é pausada nessa expressão. As variáveis ​​locais, ponteiros de array, etc. não são apagados até que o próprio objeto Fibra seja removido da memória.

Nas próximas Fiber::resume()call continua o programa a partir da próxima
expressão.

Isso é literalmente incorreto de forma assíncrona, mas não significa que seu aplicativo não pode fazer duas coisas ao mesmo tempo. A verdade aqui é que o estado da função Fibra é salvo onde foi interrompido. Você, falando figurativamente, alterna entre os carros, cada um indo para um ponto.

Uma das melhores coisas sobre start(), suspender (e resume()é que
eles aceitam argumentos:

O start()método passará argumentos para o chamável e retornará o que
quer que osuspend() método recebe.

O suspend() método retorna qualquer valor retornado pelo resume() método.

O resume() método retorna o que for recebido na próxima chamada para
suspend().

Isso torna a relação entre o segmento principal e a fibra relativamente
direta:

resume() é usado para colocar os valores em fibra que são recebidos com suspend(), e suspend() é usado para enviar valores que são recebidos por resume().

O exemplo oficial ficou mais fácil de entender agora:

Depois de executar o código acima, você receberá algo assim:

Estamos quase terminando de criar nosso próprio servidor web completo

Na verdade, o PHP trabalha em parceria com o nginx / Apache em 99% dos casos,
basicamente porque não é multi-threaded. O servidor que entra em
blocos PHP e serve apenas para alguns testes ou mostra algo para o
cliente. As fibras permitem que o PHP trabalhe com o soquete de forma mais eficiente e habilite coisas como WebSockets, eventos do lado do servidor, conexões de banco de dados em pool ou mesmo HTTP / 3 sem ter que recorrer a extensões de compilação, invadindo seu caminho com funções não intencionais, encapsulando o PHP para outro tempo de execução externo ou qualquer outra receita para desastres.

Alguns problemas podem levar algum tempo para serem resolvidos, mas se houver uma promessa de manter uma
única base de código para outros recursos sem gastar dias tentando compilar e implantar, podemos aceitar isso.

As fibras não serão usadas diretamente

De acordo com a documentação, o Fibers oferece “apenas o mínimo necessário
para que o código personalizado implemente co-rotinas full stack ou green streams em PHP.” Simplificando, a menos que você tenha um motivo muito estranho para usá-los diretamente, você nunca terá que interagir com o Fibers como se estivesse executando corrotinas em Javascript ou Go.

Alguns frameworks de alto nível (como Symfony, Laravel, CodeIgniter e
CakePHP, entre outros) levarão algum tempo para descobrir como abordar o Fibers e criar um conjunto de ferramentas com as quais eles trabalham do ponto de vista de um desenvolvedor. Alguns frameworks de baixo nível, como amphp e ReactPHP, já migraram para o Fiber em seus últimos lançamentos de desenvolvimento.

No entanto, você estará livre de pensar mais sobre o Fibers e se concentrará em sua ideia, isso significa que todos criarão suas próprias opções de simultaneidade com todos os seus benefícios e ressalvas.

Apenas uma fibra de cada vez

Vou citar Aaron Piotrowski do PHP Internals Podcast # 74:

“Como apenas um Fiber pode estar executando ao mesmo tempo, você não tem
algumas das mesmas condições de corrida que tem com a memória sendo acessada ou gravada por dois threads ao mesmo tempo.”

Aaron também acrescenta que os frameworks serão capazes de resolver problemas de simultaneidade e
sincronização no mesmo pedaço de memória.

Isso é ótimo porque você não precisa pensar em corridas de dados, semáforos e mutexes – coisas que os esquilos entendem muito bem. Mas você ainda pode operar apenas duas coisas por vez, não importa o que faça.

Sem canais simultaneamente

Com base no fato de que apenas uma fibra está funcionando por vez, mesmo se você declarar várias delas, não há problema de sincronização de dados. Mas Aaron disse que há uma possibilidade de que outra fibra acorde e reescreva o que a primeira fibra está compartilhando. Uma solução é usar o estilo de canal do Go.

Quando Deryk Rethans perguntou sobre canais, Aaron respondeu em palavras simples:
algo mais precisa ser implementado com Fibers, mas até então, a última palavra sobre como usar canais caberá aos frameworks se eles os considerarem necessários para o que oferecem, como caras no Amphp.

Comparação com um novato do bairro

A linguagem Go tem ganhado força nos últimos meses, especialmente porque foi construída a partir do paralelismo. Qualquer coisa pode ser feita simultaneamente com a palavra-chave go, e a sincronização é feita usando mutexes ou canais, tornando mais fácil de trabalhar.

Desse ponto de vista, Go está bem à frente da
solução de concorrência original do PHP . Se você precisa de algo completamente multithread, você pode fazer seu software em Go, ou mesmo Rust se você quiser usar threads de CPU diretamente.

Não é que o PHP seja incompatível com qualquer modelo de simultaneidade, mas certamente, sua base ainda é síncrona em seu núcleo devido ao fato de ser mais conveniente e compreensível. Comparado ao Go, a desvantagem do PHP é o encanamento excessivo.

Portanto, se você precisa de um verdadeiro modelo de simultaneidade como Go, o PHP terá que ser reescrito do zero, mas isso abrirá muitas possibilidades no mundo da computação que já adotou o multithreading.

Esperançosamente, isso permitirá que você se concentre mais nos recursos e na independência, sobre os quais falei muito.

 

Artigo escrito por Oleg Melnic, Líder Técnico na empresa Proxify
Com informações de CEVIU

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

×

Powered by WhatsApp Chat

× WhatsApp