ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
PHP de alta performance com RoadRunner
1. PHP de alta performance
com RoadRunner
PHP Conference 2020
Leonardo Tumadjian
2. Quem sou eu?
Não sei quem eu sou, mas sei o que quero ser!
1. PHP lover desde 2009
2. Especialista PHP na HeroSpark
3. Tech Lead/Consultor técnico na Multiverse Marketing
4. Professor/Instrutor Web a 7 anos
5. Pós graduado em Engenharia Web
6. Palestrante
7. Gamer nas horas vagas
Linkedin:
https://www.linkedin.com/in/leonardotumadjian
Youtube
https://www.youtube.com/channel/UC3k1OluPr0VPnwKmkfvwrPg
3. O PHP vai morrer?
Claro que vai, tudo morre nessa vida!
Mas… not yet!
Já experimentou comida Coreana?
Bibimp bap!
4. Proposta da palestra
Atenção, o projeto apresentado aqui não tem o intuito de ir de encontro com as
stacks que já usamos, mas sim dar uma visão de que podemos encontrar
soluções em casos de maiores necessidades, temos que ter cuidado com a hype
e estudar com muito cuidado o que devemos ou não usar.
Lembrando que não existe bala de prata e toda solução terá pontos positivos e
pontos negativos, cabe a nós achar o que melhor se adequa em nossa
necessidade.
6. Ciclo de vida de um Request
Client/Browser Server/NGINX PHP-FPM / Reverse Proxy
Request > Execução > Resposta > Fim da execução
7. Dentro da Aplicação Language boot
Globals Parser
Framework boot
Load dependencies
Load globals
Load Routes
Handle routes
Execute action (Controller)
Load Response
Stream response
8. Dentro da Aplicação Language boot
Globals Parser
Framework boot
Load dependencies
Load globals
Load Routes
Handle routes
Execute action (Controller)
Stream response
9. Preloading
O preload é um solução que veio no PHP 7.4 para que possamos indicar ao
OPCache quais classes devemos deixar pré carregadas, chegando a algo bem
semelhante, segue um exemplo:
10. Infinite looping
Técnica usada com bibliotecas assíncronas onde o servidor HTTP fica em loop, esperando por uma
requisição, as mais conhecidas são: ReactPHP e Swoole.
Abaixo uma implementação abaixo usando o swoole:
12. Apresento-lhes o RoadRunner
Servidor de aplicação de alta performance para PHP, load
balancer e gerenciador de processos escrito em Golang,
desernvolvido pela empresa russa Spiral Scout, o
RoadRunner vem com a premissa de potencializar a vida
longa ao PHP.
1. Pronto para produção
2. Alta performance
3. Não querer extensão
13. As features
Funcionalidades que vão além de performance:
1. Middlewares em Golang
2. PSR7
3. HTTPS / HTTP2
4. Load balancer / Process manager e task pipeline
5. Frontend agnostic (Queue, PSR-7, GRPC, etc)
6. Metricas (Prometheus)
7. Trabalha sobre TCP/Unix socket
8. Workers replacement
9. Gerenciamento do ciclo de vida
10. Super rápido
11. Integração com Frameworks
12. Funciona no Windows (Uau!)
14. Install
É possível instalar de duas formas:
Composer:
$ composer require spiral/roadrunner
$ ./vendor/bin/rr get-binary
$ mv ./rr /usr/local/bin/rr
Precisa ter as ext: php-curl e php-zip
Via golang build:
$ clone https://github.com/spiral/roadrunner.git
$ go mod download
$ make
$ make test
15. Config
Configure o servidor via YAML ou JSON file, criar um arquivo
.rr.yml, nele é onde é possível colocar configurações sobre o
workers, server, gerenciamento e etc.
17. Caveats
Com grandes poderes ...
Talvez o RoadRunner não seja para você, é preciso lidar com
problemas ao usar o PHP old school:
● Sem globals _POST, _GET, _COOKIES, _SESSION, _SERVER
● PSR7 request handle(PSR17 for factory)
● Problema de Upload(Symfony, Laravel)
● Exit and die
● Session default problems
18. Produção
1. Fechar todos os recursos
2. Regule seu pool time
3. MemoryLeaks
4. $workers === $cpuNumThreads
5. Evite poluição de estado(global, memory cache)
6. maxJobs
7. OPCache via CLI
8. Health Check para Nuvem
19. Integrando com Golang
Via RPC é possível delegar via PHP usando TCP ao golang
alguma execução, para que assim seja processado e
retornado a execução.
Já existe uma extensão para o RR que faz integração com
gRPC ficando ainda mais performático e padronizado as
conversas entre os serviços, segue endereço do projeto:
20. Formas de implantação
● Server as service (vertical)
● ECS Serverless (horizontal)
● K8 cluster (horizontal)
● Lambda Serverless (functional)