O que é requisição assíncrona e como usar em PHP

O que é requisição assíncrona e como usar em PHP

Nessa aula vamos explorar melhor os tipos de requisição que existem e focar nas requisição assíncrona em php. Primeiramente, precisamos considerar que quando estamos desenvolvendo uma aplicação baseada na arquitetura cliente-servidor, a comunicação acontece através de requisições e respostas. Por exemplo, um cliente (ex: navegador) envia uma requisição e o servidor (local onde está nossa aplicação) retorna uma resposta. Até o momento não há muita novidade nessas afirmações. No entanto, essa aula tem como objetivo compreender melhor o que são requisições assíncronas e como usá-las.  

Revisão: Tipos de requisição

Síncrona: Quando uma requisição é enviada, o processo remetente é bloqueado até que ocorra uma resposta, ou seja, não é possível enviar novas requisições até que nossa requisição atual seja finalizada, pois existe sincronismo entre as requisições.

Assíncrona: Em uma requisição assíncrona, não existe sincronismo entre as requisições. Assim, podemos enviar diversas requisições em paralelo e cada resposta retorna quando estiver pronta.  

Diferença entre síncrono e assincrono

 Exemplo de requisição assíncrona

Imagine que você é o cozinheiro da noite e precisa fazer um jantar para sua família. Você sabe que o jantar precisa ser servido às 19h, logo, você planeja toda cozinha para isso. Imagine que você agora tem a opção de fazer todo o jantar de forma síncrona e assíncrona, qual você escolheria? Se você escolher de forma síncrona, você primeiro deve descongelar o frango e aguardar essa tarefa terminar. Quando o frango estiver pronto você o tempera e começa a cozinhá-lo. Somente após o término do cozimento você poderá fazer outra tarefa. Por outro lado, se você escolher fazer de forma assíncrona, você poderá cozinhar o arroz enquanto o frango cozinha ou até mesmo fazer uma salada enquanto o frango descongela.  

Como fazer uma requisição assíncrona com o Javascript?

Para realizar uma requisição assíncrona é necessário utilizar um objeto específico do Javascript que permite que a requisição seja enviada. Esse objeto é o XMLHttpRequest(). Observe a imagem abaixo:   Após instanciado, é necessário adicionar um listener que lidará com o resultado da requisição. Lembrando que, como a requisição é assíncrona, simplesmente instanciar o objeto não resolve o problema. É necessário que seja indicada a URL que será feita o request e logo após executar o método send().

Exemplo de requisição assíncrona em Javascript

Requisição assíncrona em PHP

Executar tarefas de forma assíncrona no PHP não é uma tarefa trivial, existem alguns programadores que utilizam algumas funções para abrir e manipula arquivos de forma assíncrona. Porém não existe uma função mágica ou classe que faça isso por você automaticamente.

Eu sei, eu sei, é meio frustrante.

Mas, nem tudo está perdido, existem projetos que tentam superar essa dificuldade do PHP e implementar algumas coisas que podem te ajudar a construir seu programa assíncrono. O REACT PHP é uma ferramenta open source que pode te ajudar.

A página principal do framework mostra o código:

$loop = React\EventLoop\Factory::create();

$server = new React\Http\Server($loop, function (Psr\Http\Message\ServerRequestInterface $request) {
    return new React\Http\Message\Response(
        200,
        array(
            'Content-Type' => 'text/plain'
        ),
        "Hello World!\n"
    );
});

$socket = new React\Socket\Server(8080, $loop);
$server->listen($socket);

echo "Server running at http://127.0.0.1:8080\n";

$loop->run();

Podemos perceber que ao usar esse framework conseguimos criar um servidor e definimos uma porta específica para esse servidor. Isso permite que façamos o envio de informações de forma assíncrona para qualquer request.

Ok, Mas porquê isso é importante?

As vezes quando programamos temos a tendência de executar ações em sequência, isso torna o tempo total de execução maior. Usando essas requisições assíncronas você poderá definir quais serviços podem ser executados em paralelo, diminuindo o tempo de bloqueio e processamento, ou seja, você ganhará velocidade de resposta do seu sistema.

Mas cuidado, lembre-se que desenvolver aplicações assíncronas envolve também tratar problemas dessa falta de sincronia. Por exemplo, se uma ação depende de outras, muitas vezes implementá-la de forma assíncrona pode causar erros de execução caso uma dessas ações demore para responder.

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Deixe uma resposta