Skip to main content

Command Palette

Search for a command to run...

Programação Paralela, e Assíncrona com PHP

Updated
7 min read
Programação Paralela, e Assíncrona com PHP
L

I am a Senior Software Architect with extensive experience in backend development, specializing in PHP frameworks such as Laravel and Hyperf. My expertise lies in software architecture and building scalable, high-performance applications with a strong focus on Developer Experience. I design and evolve modern architectures including well-structured monoliths, microservices, and event-driven systems, always striving for a balance between performance, simplicity, and cost. I have hands-on experience in high-scale environments with over 100k users, legacy modernization, cloud cost optimization, robust API design, event-driven architectures, technical debt management, and advocating best engineering practices. As a tech community enthusiast, I organize events at DevParaná and actively share knowledge to strengthen the local ecosystem.

As a dedicated professional, I thrive on collaboration and communication, fostering strong relationships with colleagues and clients alike. My adaptability allows me to navigate challenges with ease, while my problem-solving skills enable me to find innovative solutions in dynamic environments. I believe in the power of empathy and active listening, which helps me understand diverse perspectives and create inclusive spaces. My commitment to continuous learning drives me to seek growth opportunities, ensuring that I contribute effectively to any team. I am passionate about leveraging my emotional intelligence to inspire and motivate those around me.

  • Event-Driven Architecture
  • API Design
  • Microsserviços
  • Developer Experience (DX)
  • Clean Architecture / DDD / SOLID
  • Microservices Architecture
  • Docker
  • PHP (Laravel, Hyperf, Swoole)
  • Software Architecture
  • Cloud Computing
  • Node.js
  • Laravel (PHP)
  • Hyperf
  • Kubernetes
  • GraphQL
  • Swoole

Photo by Ben Griffiths on Unsplash

Introdução

PHP é uma linguagem de programação de propósito geral, amplamente utilizada para desenvolvimento web. No entanto, PHP também pode ser utilizado para desenvolvimento de aplicações desktop, scripts de automação, entre outros. Neste artigo, vamos explorar o uso de PHP para programação paralela e assíncrona.

Programação Paralela

Programação paralela é um paradigma de programação que consiste em dividir um problema em partes menores que podem ser executadas simultaneamente. Em PHP, a programação paralela pode ser feita utilizando a extensão parallel ou a extensão pthreads, que permite a criação de threads em PHP.

Mas você sabe o que é uma thread?

Uma thread é uma unidade básica de processamento que pode ser executada de forma independente. Em um programa paralelo, várias threads podem ser executadas simultaneamente, o que pode resultar em um aumento significativo de desempenho.

Quando você compra um processador com múltiplos núcleos, você está comprando a capacidade de executar várias threads simultaneamente. No entanto, para aproveitar ao máximo essa capacidade, é necessário que o software seja desenvolvido de forma a utilizar esses recursos de forma eficiente.

Exemplo de Programação Paralela em PHP

<?php

use function parallel\run;

class DataProcessor
{
public function process(array $data): array {
$formattedData = $this->formatData($data);
$excel_file = $this->generateExcel($formattedData);
$this->sendEmail($excel_file, Auth::user()->email);
}
}

$data = range(1, 1000);

$processor = new DataProcessor();

$parallelResult1 = run(function () use ($processor, $data) {
return $processor->process($data);
});

$parallelResult2 = $processor->process($data);

No exemplo acima, estamos utilizando a extensão parallel para executar o método process da classe DataProcessor em paralelo. Isso significa que o método será executado em uma thread separada, o que pode resultar em um aumento de desempenho.

Isso não é bala de prata, e nem sempre é a melhor solução para todos os problemas. No entanto, em alguns casos, a programação paralela pode ser uma forma eficiente de melhorar o desempenho de uma aplicação.

O exemplo acima é bastante simplificado, mas ilustra como a programação paralela pode ser utilizada em PHP. Para obter mais informações sobre a extensão parallel, consulte a documentação oficial.

Aqui esta uma imagem de um exemplo de programação paralela em PHP:

Imagem ilustrativa de um exemplo de programação paralela retirada da internet.

Perceba que a programação paralela é diferente da programação assíncrona. Na programação paralela, várias threads são executadas simultaneamente, enquanto na programação assíncrona, várias tarefas podem ser executadas de forma concorrente, mas não necessariamente simultaneamente.

Programação Assíncrona

Programação assíncrona é um paradigma de programação que consiste em executar tarefas de forma concorrente, sem a necessidade de esperar que uma tarefa seja concluída para iniciar outra. Em PHP, a programação assíncrona pode ser feita utilizando a extensão swoole, que permite a criação de servidores web assíncronos em PHP.

Mas você sabe o que é um servidor web assíncrono?

Um servidor web assíncrono é um servidor que pode lidar com várias requisições simultaneamente, sem a necessidade de criar uma nova thread para cada requisição. Isso permite que o servidor seja mais eficiente e possa lidar com um grande número de requisições de forma concorrente.

Você pode achar o termo “servidor auto-contido” em alguns lugares, mas a ideia é a mesma: um servidor que pode lidar com várias requisições simultaneamente, sem a necessidade de criar uma nova thread para cada requisição.

Exemplo de Programação Assíncrona em PHP

use Swoole\Http\Server;

$server = new Server("0.0.0.0", 9501);

$server->on("start", function (Server $server) {
echo "Server started at http://{$server->host}:{$server->port}\n";
});

$server->on("request", function ($request, $response) {
$data = $request->rawContent();
$response->end("Received data: $data");
});

$server->start();

No exemplo acima, estamos utilizando a extensão swoole para criar um servidor web assíncrono em PHP. O servidor irá escutar na porta 9501 e responder a todas as requisições com uma mensagem contendo os dados recebidos

Esse exemplo é bastante simplificado, mas ilustra como a programação assíncrona pode ser utilizada em PHP. Para obter mais informações sobre a extensão swoole, consulte a documentação oficial.

Aqui esta uma imagem de um exemplo de programação assíncrona:

Imagem ilustrativa de um exemplo de programação assíncrona retirada da internet.

Ciclo de Vida de uma Requisição no PHP-FPM

Quando uma requisição é feita a um servidor web PHP, como o PHP-FPM, o servidor passa por várias etapas para processar a requisição e retornar uma resposta ao cliente. O ciclo de vida de uma requisição no PHP-FPM pode ser dividido em várias etapas:

  1. Recebimento da Requisição: O servidor web (Apache, Nginx, etc.) recebe a requisição do cliente e a encaminha para o PHP-FPM.
  2. Pool de Processos: O PHP-FPM mantém um pool de processos PHP pré-carregados para processar as requisições. Quando uma requisição é recebida, o PHP-FPM escolhe um processo disponível para processar a requisição.
  3. Autoload: O PHP-FPM carrega os arquivos necessários para processar a requisição, incluindo as classes e funções utilizadas no script PHP. As classes e funções são carregadas automaticamente pelo PHP, de acordo com as regras de autoload definidas no arquivo composer.json.
  4. Análise e Compilação: O PHP analisa o script PHP e compila o código em uma forma que pode ser executada pelo interpretador PHP.
  5. Execução do Script: O PHP executa o script PHP, processando as instruções e gerando a saída da requisição.
  6. Gerar Resposta: O PHP-FPM gera a resposta da requisição, incluindo o cabeçalho HTTP e o corpo da resposta.
  7. Envio da Resposta: O PHP-FPM envia a resposta ao servidor web, que a encaminha de volta ao cliente.
  8. Encerramento do Processo: Após enviar a resposta, o processo PHP é encerrado e retorna ao pool de processos disponíveis para processar novas requisições.

O ciclo de vida de uma requisição no PHP-FPM pode variar dependendo da configuração do servidor web e do PHP-FPM. No entanto, essas etapas são comuns na maioria dos servidores web PHP.

Ciclo de Vida de uma Requisição no Swoole

Quando uma requisição é feita a um servidor web assíncrono PHP, como o Swoole, o servidor passa por várias etapas para processar a requisição e retornar uma resposta ao cliente. O ciclo de vida de uma requisição no Swoole pode ser dividido em várias etapas:

O início do ciclo de vida de uma requisição no Swoole começa com a inicialização do servidor Swoole e a configuração do script PHP que será executado para processar as requisições. O servidor Swoole escuta em uma porta específica e aguarda a chegada de requisições.

Nesse ponto, o servidor já está com o autoload configurado, as classes e funções necessárias já estão carregadas e o script PHP está pronto para processar as requisições.

  1. Recebimento da Requisição: Quando uma requisição é feita ao servidor Swoole, o servidor recebe a requisição e a encaminha para o script PHP configurado para processar a requisição.
  2. Processamento da Requisição: O script PHP processa a requisição, executando as instruções necessárias para gerar a resposta da requisição.
  3. Análise e Compilação: O PHP analisa o script PHP e compila o código em uma forma que pode ser executada pelo interpretador PHP.
  4. Execução do Script: O PHP executa o script PHP, processando as instruções e gerando a saída da requisição.
  5. Gerar Resposta: O script PHP gera a resposta da requisição, incluindo o cabeçalho HTTP e o corpo da resposta.
  6. Envio da Resposta: O servidor Swoole envia a resposta ao cliente, encerrando o ciclo de vida da requisição.

E nesse momento, o servidor Swoole está pronto para processar novas requisições, mantendo um pool de processos PHP disponíveis para processar as requisições de forma assíncrona.

A diferença entre o ciclo de vida de uma requisição no PHP-FPM e no Swoole está na forma como o servidor PHP é inicializado e como as requisições são processadas. No PHP-FPM, o servidor PHP é inicializado para processar uma única requisição de cada vez, enquanto no Swoole, o servidor PHP é inicializado para processar várias requisições de forma assíncrona.

Conclusão

Neste artigo, exploramos o uso de PHP para programação paralela e assíncrona. A programação paralela e assíncrona são técnicas de programação que podem ser utilizadas para melhorar o desempenho de uma aplicação e lidar com um grande número de requisições de forma eficiente.

Nem tudo é regra, e nem sempre a programação paralela ou assíncrona é a melhor solução para um problema. No entanto, é sempre bom conhecer as diferentes técnicas de programação disponíveis e saber quando utilizá-las de forma eficiente.

Espero que este artigo tenha sido útil e que você tenha aprendido algo novo sobre programação paralela e assíncrona em PHP. Espero que futuramente eu consiga fazer um artigo mais detalhado sobre cada uma dessas técnicas, com exemplos mais complexos e detalhados.

Qualquer dúvida, correção ou sugestão, fique à vontade para entrar em contato. Obrigado por ler até aqui!

Referências

Autor

20 views

More from this blog

L

Luiz Schons

28 posts