Primeiras aulas do curso Swoole PHP: servidor assíncrono e corrotinas com PHP

Swoole PHP: servidor assíncrono e corrotinas com PHP

Entendendo o conceito - Apresentação

Olá, pessoal! Boas-vindas à Alura, eu sou o Vinícius Dias e vou guiar vocês nesse treinamento, onde vamos conhecer o Swoole, que está fazendo bastante barulho na comunidade PHP.

Antes de começar esse treinamento é muito importante que você entenda conceitos como programação assíncrona, event loop, até, um pouco, da ideia por trás de programação reativa. Por isso, primeiro, eu preciso que você faça o treinamento de PHP, de programação assíncrona e reativa. Com esses conhecimentos, tudo que vamos ver com o Swoole vai ser muito mais natural.

Então vamos começar por onde terminamos o nosso treinamento de programação assíncrona e reativa, com o servidor. Lá fizemos um servidor de WebSocket, aqui começamos criando um servidor HTTP.

Nessa criação de um servidor HTTP vamos entender o funcionamento de Swoole. Grande parte do funcionamento dele é sobre corrotinas. Então vamos entender o que é essa tal de corrotina que o Swoole nos traz de forma um pouco mais performática – vamos chamar assim -. Porque o conceito de corrotinas, como vamos ver nesse treinamento, já existe no PHP, mas o Swoole trouxe isso de outra forma para nós.

Então a primeira coisa que vamos executar nessas corrotinas é ver que, mesmo tendo a primeira execução demorando 2 segundos e a segunda execução demorando 1 segundo, nós não vamos ter um total de tempo de execução, de 3 segundos, e sim de algo próximo de 2 segundos. Só que isso, claro, devido às corrotinas e à execução do Swoole. Então antes de executar, vamos instalar o Swoole e ver o que é ele.

Com isso tudo entendido, conhecendo as corrotinas, vamos subir um servidor HTTP, de novo, fazendo requisição para outro servidor HTTP, que demora 1 segundo para responder, e lendo outro arquivo.

Pegando isso como exemplo, como a requisição HTTP está sendo feita primeiro, primeiro ela deveria ser exibida e depois o resultado desse arquivo, mas como estamos utilizando corrotinas, podemos notar que, primeiro, nos é devolvido, o que está executando mais rápido, que é a leitura do arquivo de texto.

Então vamos entendendo isso gradativamente para, no final, pegarmos uma aplicação completa, feito no treinamento de MVC, um pouco atualizada, com conceitos de PHP 8, mas a lógica por trás é exatamente a mesma, e essa aplicação vamos migrar do padrão que já tínhamos feito, utilizando o PHP puro, na forma tradicional, e vamos trazer para um servidor Swoole.

Com isso, já entendemos a ideia por trás de hooks, do Swoole, então fazendo esse servidor, vemos que é possível servir – entrando na pasta, claro – uma aplicação padrão, PHP, uma aplicação web, utilizando o Swoole como servidor.

Então vamos utilizar essa aplicação completa, inclusive, com um problema que esbarramos com o Swoole, que é o uso de sessões. Vamos conseguir utilizar sessões da mesma forma que utilizávamos antes, para ter o login, para ter flash messages, mas vamos entender os problemas que isso causa.

Após ter aprendido bastante e colocado isso tudo em prática, vamos bater um papo legal. Primeiro, sobre benchmarks. Vamos falar sobre a performance do Swoole, que é o principal atrativo, e vamos falar sobre ferramentas para integrar o Swoole com o seu framework favorito.

Então espero que você tire bastante proveito, não esqueça dos pré-requisitos desse treinamento e, claro, se no processo de aprendizado você ficar com alguma dúvida, algo não fizer sentido, ou até se você tiver alguma dúvida de algo que não foi abordado nesse treinamento, até porque é impossível falar tudo de Swoole, em um treinamento, ou até em vários, não excite, abre uma dúvida no fórum.

Eu tento responder pessoalmente sempre que possível, mas quando eu não consigo, temos uma grande comunidade de alunos, moderadores, instrutores, e, com certeza, alguém vai conseguir te ajudar.

Chega de papo, vamos finalmente colocar a mão na massa, mas primeiro vamos entender, direito, o que é esse tal de Swoole e como ele funciona, a partir do próximo vídeo.

Entendendo o conceito - Servidor auto-contido

Olá, pessoal! Boas-vindas de volta. Antes de colocarmos numa massa, pelo menos instalar esse tal de Swoole, vamos entender qual á a proposta principal, qual é a ideia de como vamos utilizar no final do treinamento.

O que acontece, como funciona o PHP, de forma tradicional? Essa imagem já foi mostrada em alguns outros cursos e vídeos, na Alura, por exemplo, um vídeo que tem na Alura+ sobre mitos sobre o PHP. E assim funciona o PHP com o PHP-FPM, que é a forma mais famosa e comum de colocarmos uma aplicação, em PHP, em produção.

Então como funciona? O PHP-FPM é um servidor de aplicação de PHP, que utiliza o protocolo FastCGI. Se você quiser mais detalhes sobre isso, eu tenho um treinamento sobre Nginx, que falamos sobre esse protocolo.

Mas, continuando, algum servidor web, no caso, o da imagem, Nginx, recebe várias requisições. Ele passa essas requisições para o nosso servidor de aplicação, o PHP-FPM. O PHP-FPM cria vários processos que gerenciam as requisições que vão entrar, e esses processos criam várias threads, ou vários outros processos, enfim, eles executam as requisições em si, executam o processamento dessas requisições.

O que acontece? Recebemos, nessa imagem, 4 requisições, o Nginx passa para o PHP-FPM, que tem duas threads. Essas duas threads gerenciam as requisições que vão entrar. Então várias requisições podem ser tratadas pela mesma thread, como podemos ver: duas requisições sendo tratadas por uma thread e duas sendo tratadas por outra thread.

O ponto é: quando essa resposta já é processada e enviada de volta para o Nginx, todo o processo teria que ser feito de novo, para responder a próxima requisição. Como assim? O que isso quer dizer?

Carregar o autoloader do composer, por exemplo, iniciar o seu framework, iniciar aquela parte de aplicação, carregar todas as dependências, carregar todas as configurações, isso tudo tem que ser refeito para cada uma das requisições, porque cada requisição é completamente independente, como o HTTP foi criado para ser.

Então o PHP – eu gosto bastante de falar isso – ele respeita a web como ela é, cada requisição é realmente independente, nesse modelo tradicional.

Só que isso tem uma grande vantagem, claro, não precisamos nos preocupar com a gestão de memória, pool de conexões com banco de dados, etc., mas isso tem uma desvantagem, que é esse over head em cada uma dessas requisições, ou seja, esse trabalho adicional em cada uma das requisições.

A cada requisição precisamos recarregar o autoloader, carregar as configurações, carregar as dependências e depois executar o código da nossa aplicação, carregar o framework, etc.

Então o que queremos fazer, o objetivo final, é ter um servidor autocontido. O que isso quer dizer? O que podemos chamar de um servidor autocontido? Já fizemos isso naquele treinamento de PHP reativo e assíncrono.

Durante o treinamento fomos aprendendo muito sobre programação assíncrona e, no final, temos um servidor que utiliza de programação reativa, um servidor escrito em PHP. Então eu vou pegar o código desse servidor, o código do que tivemos no final do treinamento.

Nós criamos um servidor HTTP com aquele decorator de WebSocket, mas beleza, criamos um servidor, seja ele como for. Rodando esse servidor, temos esse componente que responde à cada uma das requisições. Ou seja, quando chega uma mensagem, ele manda essa mensagem para os outros clientes, etc.

Mas o ponto é, repare que isso é um código em PHP, que é executado uma vez só, então quando eu executo isso, o nosso autoloader já é executado uma vez só, todas as dependências já são carregadas, todos esses códigos já são resolvidos, esse objeto é instanciado uma vez só e ele fica na memória.

Então sempre que alguém se conecta ao nosso servidor, isso tudo já foi feito: o autoloader já foi carregado, o objeto já foi instanciado, então estamos prontos para, simplesmente, executar esse pedaço de código assinalado. O nosso framework já foi carregado, o react PHP já foi carregado, isso tudo já está em memória.

Então quando chega uma nova mensagem no nosso WebSocket, ele só executa esse pedaço de código assinalado, que é mandar essa mensagem para outra conexão. Ele não precisa, a cada requisição, carregar o autoloader, carregar o framework, carregar o nosso componente, de novo, ele não faz nada disso.

Isso tudo foi feito uma vez só e através de programação assíncrona, ele vai podendo executar esse código, conforme as requisições vão chegando.

Então essa é a ideia por trás de um servidor autocontido. Em PHP temos um servidor e a nossa própria aplicação expõe isso, não precisamos de um servidor externo, como o PHP-FPM, por exemplo. A nossa aplicação se expõe para o mundo externo, ela permite o acesso a ela mesma.

Então é isso que vamos atingir no final desse treinamento do Swoole. Vamos ter algo muito parecido com isso, só que não vamos tratar de WebSocket, porque já falamos bastante naquele treinamento de PHP reativo.

Então nós vamos caminhando, conhecendo o framework, que é a ferramenta Swoole e, no final, teremos um servidor HTTP que responde às requisições dessa forma: o nosso código de PHP vai expor uma porta, por exemplo, a porta 8002, ou qualquer outra e, a cada requisição que chegarmos, um método ou uma função vai ser executado e essa função vai conter o nosso código que tem nossos controlers, nossas views, que tem tudo que já conhecemos.

Então para que consigamos chegar nesse objetivo, muitos conhecimentos são necessários, como todo aquele conhecimento que adquirimos no curso de PHP ativo e assíncrono, essa ideia de como o PHP-FPM funciona, para entendermos que isso não vai ser verdade, mais, e eu quero deixar muito claro que isso é um código que vai ficar executando, por quê?

Imagine que eu utilize variáveis globais na minha aplicação, essas variáveis globais vão ser compartilhadas por todas as requisições. Claro que existem detalhes, porque assim como no PHP-FPM temos processos ou threads diferentes, com o Swoole também vamos ter processos diferentes, mas esse mesmo processo vai compartilhar as variáveis globais.

Então se eu tenho uma variável global que, teoricamente eu só precisaria para esse usuário/requisição, a outra requisição vai ter acesso a essa variável, também, então temos que evitar, ao máximo, o vazamento de memória, o vazamento de percursos, a utilização de variáveis globais, etc.

Mas isso vamos praticando com o tempo e tudo vai ficando mais claro. A ideia desse vídeo é explicar o conceito de um servidor autocontido, que, no final do treinamento, é o que queremos atingir. Então é importante que já entendamos que já fizemos isso e nós vamos fazer, agora, de outra forma.

Mais falado desse conceito, vamos falar, especificamente, sobre o Swoole, o que é esse tal de Swoole, como instalamos para poder utilizar, mas isso, no próximo vídeo.

Entendendo o conceito - Instalação

Olá, pessoal! Bem vindos de volta. Então vamos entender o que é esse tal de Swoole. Já entendemos a ideia por trás de um servidor autocontido, e o Swoole, dentre várias outras coisas, vai permitir que criemos um servidor autocontido, só que com muita performance, por quê? Além do Swoole usar aqueles conceitos de programação assíncrona, reativa, IO assíncrono, ele usa alguns conceitos a mais.

Primeiro, o Swoole não é um framework PHP, ele é uma extensão PHP, ou seja, o código do Swoole foi escrito em “C”, ele é compilado, então ele tem uma performance maior, ele conversa mais perto com o hardware. Então ele gerencia os recursos, com mais controle, ou seja, Swoole é escrito em “C”, é uma extensão do PHP.

Um outro detalhe é que ele usa conceitos de corrotinas. Vamos falar um pouco mais sobre isso, mas, basicamente, é uma outra forma de criarmos códigos assíncronos, só que como se o código tivesse sendo escrito de forma síncrona, ou seja, ele facilita, um pouco, a sintaxe para a gente.

vamos, como eu disse, falar sobre isso mais para frente. Agora vamos ver como instalamos o Swoole. Como eu disse, ele é uma extensão, então instalamos o Swoole como instalaríamos qualquer outra extensão do PHP.

Então, vamos à parte de instalação. Para Linux utilizamos o PECL, então é só rodar o pecl install swoole. Existem várias opções que podemos fazer e configurar, não vamos configurar nada disso. Para MacOS, tendo o PHP instalado, claro, igualmente, a mesma coisa, vamos instalar através do PECL, então é só rodar pecl install swoole.

Agora, Vinicius, você falou de Linux, de Mac, e no Windows como eu vou fazer? O Swoole não roda no Windows, ele não funciona no Windows. Então para executar o Swoole em uma máquina Windows, você tem duas opções: você pode utilizar o WSL, que é o Windows Subsystem for Linux, ou algo assim, não tenho certeza. Mas basicamente você consegue ter um Linux, dentro do seu Windows, sem instalar máquina virtual ou algo do tipo.

Mas como eu não tenho Windows, não vou conseguir mostrar para vocês como configurar isso, porque, por não utilizar Windows, eu não sei configurar isso, mas eu tenho o Docker instalado, então ao invés de utilizar o Swoole, instalado direto na minha máquina, para tornar isso um pouco mais próximo do que você vai fazer no Windows, por exemplo, vamos utilizar Docker.

Então já existem treinamentos na Alura, de Docker, mas caso você não conheça, não é muito difícil, é basicamente uma forma de você criar máquinas virtuais. No curso de Docker você entende como isso não é, realmente, uma máquina virtual, mas para simplificar, você pode pensar como se fosse isso.

Então eu tenho um arquivo chamado “dockerfile”, que é o que define o que vai ter em uma máquina virtual. Então, a partir de uma imagem oficial do PHP, ou seja, a partir de PHP, nessa versão “8.0”, que só tem a “cli”, a linha de comando. Eu não preciso do FPM, Apashe, nada disso.

Então, a partir da imagem do PHP, eu quero rodar esse comando RUN pecl install swoole que instala o Swoole. Esse outro comando RUN docker-php-ext-enable swoole habilita a extensão do Swoole, nessa máquina, nesse container do Docker, vamos chamar assim.

Como eu posso tornar isso algo executável? Eu vou abrir meu terminal e o que eu posso fazer? docker build -t para dar um nome/tag para essa imagem que vamos criar, e eu vou chamar de PHP Swoole. Eu coloco um ponto para indicar que o arquivo que ele quer encontrar, o “dockerfile” está na pasta atual, ou seja, ´.´.

Quando eu rodar, ele vai fazer o build dessa imagem do Docker e vamos ter agora, na nossa máquina, uma imagem chamada “php-swoole”. Mas beleza, eu já tenho essa imagem, então o que podemos fazer agora? Fazer um docker run -itv, ou seja, esse terminal vai ser interativo, eu vou poder editar coisas nele.

O “t” é de TTY, para, basicamente, tornar o terminal da minha máquina e o terminal desse container, um só, basicamente é isso. E “v” que é criar um volume, eu vou compartilhar arquivos que estão na minha pasta atual, com a pasta do meu container.

Então você vai fazer a sua pasta atual, por exemplo, C:\Dev\php-swoole, você vai deixar nesta pasta, :/app. No meu caso, a minha pasta não está nesse caminho, então vou colocar o meu caminho. Como eu estou no Mac, eu posso pegar a pasta atual. Eu vou dizer que essa imagem vai rodar na pasta “app”, que é a que eu mapeei. No final eu coloco “bash”, para executar bash dentro desse container.

Eu fiz uma bobeira. Primeiro eu preciso informar qual imagem eu vou utilizar, que é o “php-swoole”, a que acabamos de criar. Dentro do “php-swoole” eu vou executar o comando bash.

Agora sim, eu estou dentro da minha máquina virtual. Se eu rodo php -n eu vejo que eu tenho o Swoole, instalado. Assim, utilizamos o Docker para ter o Swoole instalado, mas se você está no Linux ou no Mac, é só executar pecl install swoole, só isso, não tem segredo nenhum.

Agora que temos o Swoole instalado, vamos começar a entender como ele funciona, vamos ver o que podemos fazer, simplificando, por enquanto, esse tal de Swoole, no próximo vídeo.

Sobre o curso Swoole PHP: servidor assíncrono e corrotinas com PHP

O curso Swoole PHP: servidor assíncrono e corrotinas com PHP possui 115 minutos de vídeos, em um total de 48 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas