PHP de alta performance
com RoadRunner
PHP Conference 2020
Leonardo Tumadjian
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
O PHP vai morrer?
Claro que vai, tudo morre nessa vida!
Mas… not yet!
Já experimentou comida Coreana?
Bibimp bap!
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.
Servidores para PHP
https://hostingwiki.org/what-is-apache/ https://www.zabbix.com/integrations/nginx https://www.similartech.com/technologies/zend-server
Ciclo de vida de um Request
Client/Browser Server/NGINX PHP-FPM / Reverse Proxy
Request > Execução > Resposta > Fim da execução
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
Dentro da Aplicação Language boot
Globals Parser
Framework boot
Load dependencies
Load globals
Load Routes
Handle routes
Execute action (Controller)
Stream response
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:
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:
Problemas
1. Dificil monitorar
2. Gerenciamento de memória
3. I/O sem padrão
4. Extensão do PHP
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
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!)
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
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.
Escrevendo um Worker
Um simples worker sem framework:
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
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
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:
Formas de implantação
● Server as service (vertical)
● ECS Serverless (horizontal)
● K8 cluster (horizontal)
● Lambda Serverless (functional)
Performance
Performance
Rodando o RoadRunner
● Config
● Server command
● Worker
● Frameworks
Perguntas?
Obrigado!
Contato: tumadjian@gmail.com
Referências
Site official:
https://roadrunner.dev
Documentação:
https://roadrunner.dev/docs
Artigos:
https://spiralscout.com/blog/php-was-never-meant-to-die
https://dzone.com/articles/new-dedicated-application-server-revs-php-to-peak
https://mnapoli.fr/serverless-php-performances/
https://stitcher.io/blog/preloading-in-php-74

PHP de alta performance com RoadRunner

  • 1.
    PHP de altaperformance com RoadRunner PHP Conference 2020 Leonardo Tumadjian
  • 2.
    Quem sou eu? Nãosei 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 vaimorrer? 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.
  • 5.
    Servidores para PHP https://hostingwiki.org/what-is-apache/https://www.zabbix.com/integrations/nginx https://www.similartech.com/technologies/zend-server
  • 6.
    Ciclo de vidade um Request Client/Browser Server/NGINX PHP-FPM / Reverse Proxy Request > Execução > Resposta > Fim da execução
  • 7.
    Dentro da AplicaçãoLanguage boot Globals Parser Framework boot Load dependencies Load globals Load Routes Handle routes Execute action (Controller) Load Response Stream response
  • 8.
    Dentro da AplicaçãoLanguage 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 usadacom 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:
  • 11.
    Problemas 1. Dificil monitorar 2.Gerenciamento de memória 3. I/O sem padrão 4. Extensão do PHP
  • 12.
    Apresento-lhes o RoadRunner Servidorde 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 quevã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 instalarde 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 servidorvia YAML ou JSON file, criar um arquivo .rr.yml, nele é onde é possível colocar configurações sobre o workers, server, gerenciamento e etc.
  • 16.
    Escrevendo um Worker Umsimples worker sem framework:
  • 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 todosos 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 ViaRPC é 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)
  • 21.
  • 22.
  • 23.
    Rodando o RoadRunner ●Config ● Server command ● Worker ● Frameworks
  • 24.
  • 25.
  • 26.