Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Como o PHP Funciona por Baixo dos Panos

Como o PHP Funciona por Baixo dos Panos

Você já parou para pensar em como o seu código PHP é executado por baixo dos panos? Nesta palestra, vamos descer alguns níveis para explorar as entranhas do motor do PHP. Abordaremos a diferença entre linguagens compiladas e interpretadas, o pipeline de execução de um programa (análise léxica, sintática, compilação e execução), o papel dos famosos opcodes, a compilação Just-In-Time, o funcionamento da Zend Engine e algumas ferramentas que se beneficiam desse processo. Ao final, você terá uma visão mais clara de como o PHP realmente funciona e de como esse conhecimento pode se transformar em ganhos práticos de desempenho e qualidade no seu dia a dia.

Avatar for Marcel dos Santos

Marcel dos Santos

September 15, 2025
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Interaja nas mídias sociais! - fale sobre o evento, palestrantes

    e conteúdo - tire fotos do evento e publique - interaja com outros participantes do evento - tire dúvidas ou dê feedbacks para os palestrantes - utilize as hashtags #php, #ingaphp e #devparana
  2. A maioria das pessoas usam a linguagem sem conhecer a

    ciência e engenharia de décadas que faz a sua linguagem funcionar!
  3. Te ajuda a melhorar o desempenho de execução e economizar

    recursos como memória e processamento.
  4. Uma linguagem compilada é aquela em que o código fonte

    é traduzido para código de máquina nativo antes da execução.
  5. Entende-se por código de máquina nativo o conjunto de instruções

    executáveis pelo processador de acordo com sua arquitetura.
  6. Cada arquitetura possui características especí fi cas como tamanho de

    instruções e conjunto de instruções simples ou complexo (RISC ou CISC).
  7. Uma linguagem interpretada é aquela em que o código é

    executado diretamente pelo interpretador, instrução por instrução.
  8. / / código que será transformado em tokens $code =

    '<?php $name = "John"; echo "Hello" . $name . "!"; ?>'; $tokens = PhpToken : : tokenize($code); foreach ($tokens as $token) { echo "{$token - > getTokenName()} ('{$token - > text}')" . PHP_EOL; }
  9. T_OPEN_TAG ('<?php ') T_VARIABLE ('$name') T_WHITESPACE (' ') = ('=')

    T_WHITESPACE (' ') T_CONSTANT_ENCAPSED_STRING ('"John"') ; (';') T_WHITESPACE (' ') T_ECHO ('echo') T_WHITESPACE (' ') T_CONSTANT_ENCAPSED_STRING ('"Hello"') T_WHITESPACE (' ') . ('.') T_WHITESPACE (' ') T_VARIABLE ('$name') T_WHITESPACE (' ') . ('.') T_WHITESPACE (' ')
  10. A análise sintática é responsável por ler os tokens gerados

    na etapa de análise léxica e gerar uma árvore sintática abstrata.
  11. Uma árvore sintática abstrata, abstract syntax tree ou AST é

    uma representação estruturada em forma de árvore do código fonte.
  12. / / árvore sintática abstrata (AST) usando o PHP Parser

    PhpParser\Node\Stmt\If_( cond: PhpParser\Node\Expr\BinaryOp\Identical( left: PhpParser\Node\Expr\Variable( name: "condition" ) right: PhpParser\Node\Scalar\String_( value: "demo" ) ) stmts: [ 0 : PhpParser\Node\Stmt\Return_( expr: PhpParser\Node\Expr\ConstFetch( name: PhpParser\Node\Name\FullyQualif i ed( parts: ["true"] ) ) ) ] elseifs: [] else: null )
  13. O PHP usa uma ferramenta chamada Bison para gerar a

    implementação do parser a partir da gramática da linguagem.
  14. A funcionalidade de AST foi introduzida no PHP 7 e

    trouxe inúmeros benefícios à linguagem.
  15. Documento da RFC para inclusão de uma abstract syntax tree

    no processo de compilação da linguagem.
  16. Um parser error é lançado quando o parser não consegue

    transformar a sequência de tokens em uma AST válida.
  17. / / código que irá gerar um ParserError function greeting[string

    $name] { echo "Hello" . $name . "!" . PHP_EOL; } greeting('Alice'); / / Parse error: syntax error, unexpected token "[", / / expecting "(" in parser - error.php on line 5 erro de sintaxe que irá ocasionar um parser error
  18. As causas comuns são: - esquecer ponto e vírgula no

    fi nal da instrução - esquecer parênteses, colchetes ou chaves - esquecer de fechar strings ou comentários
  19. A compilação é o processo de transformar a AST (abstract

    syntax tree) em um conjunto de instruções reconhecidas pela máquina virtual.
  20. O PHP não tinha a etapa de AST, o código

    ia de tokens para opcodes e isso fazia com que otimizações deixassem de ser realizadas.
  21. Para este conjunto de instruções dá-se o nome de representação

    intermediária ou intermediate representation (IR).
  22. Além disso, ela permite uma melhor portabilidade na etapa de

    compilação, isto é, que a transformação em código de máquina seja facilitada.
  23. Alguns de baixo nível como para adicionar dois números e

    outros de alto nível como carregar a propriedade de um objeto pelo nome.
  24. / / código que será transformado em opcodes function greeting(string

    $name) { echo "Hello " . $name . "!" . PHP_EOL; } greeting('Bob');
  25. $_main: ; (lines=4, args=0, vars=0, tmps=1) ; (before optimizer) ;

    /app/04-opcodes.php:1-9 ; return [] RANGE[0 . . 0] 0000 INIT_FCALL 1 144 string("greeting") 0001 SEND_VAL string("Bob") 1 0002 DO_UCALL 0003 RETURN int(1) greeting: ; (lines=6, args=1, vars=1, tmps=3) ; (before optimizer) ; /app/04-opcodes.php:5-7 ; return [] RANGE[0 . . 0] 0000 CV0($name) = RECV 1 0001 T1 = CONCAT string("Hello ") CV0($name) 0002 T2 = CONCAT T1 string("!") 0003 T3 = CONCAT T2 string(" ") 0004 ECHO T3 0005 RETURN null Hello Bob!
  26. A execução é a etapa em que os opcodes são

    lidos e executados pelo interpretador.
  27. O opcode é interpretado e executado, isto é, transformado em

    código de máquina (interpretação) e executado pela máquina virtual.
  28. Os opcodes são transformados em código nativo em tempo de

    execução, isto é, uma compilação just-in-time (JIT).
  29. O PHP possui suporte a JIT desde o PHP 8

    baseado em DynASM do Lua JIT.
  30. A partir da versão 8.4 o PHP passou a usar

    uma nova implementação de JIT.
  31. O JIT oferece benefício em tarefas CPU- bound como cálculo

    numéricos, machine learning entre outras.
  32. O seu objetivo é simpli fi car a manipulação e

    análise estática de código PHP.
  33. Métricas robustas do PHP Parser no Packagist.org. Mais de 800

    milhões de instalações e quase 2 mil bibliotecas como dependências.
  34. O russo Nikita Popov, grande contribuidor do core do PHP

    e agora líder de desenvolvimento do projeto LLVM.
  35. O Rector é uma ferramenta que usa o PHP Parser

    e é usado para fazer transformações automáticas ou refatorações.
  36. Exemplo de transformações usando a ferramenta Rector para melhorar a

    qualidade, refatorar e evoluir uma base de código PHP.
  37. O PHPStan é uma ferramenta que usa o PHP Parser

    e é usado para fazer a análise estática do código e encontrar erros de vários tipos.
  38. Exemplo de análise estática usando a ferramenta PHPStan para melhorar

    a qualidade e adicionar guard rails em uma base de código PHP.
  39. O Mago é um conjunto de ferramentas para PHP que

    inclui formatter, linter e análise estática em uma a solução all-in-one.
  40. É uma ferramenta escrita em Rust com foco em desempenho

    e possui uma implementação de lexer e parser.
  41. A ferramenta Mago é implementada em Rust e possui foco

    em desempenho para formatação, linter e análise estática em PHP.
  42. A ferramenta Mago faz uso de lexer e parser para

    fazer introspecção de código PHP e aplicar formatação e análises estáticas.
  43. Ela te dá insumos para ser capaz de identi fi

    car problemas de desempenho e para otimizar aplicações.
  44. O JIT no PHP veio para melhorar o desempenho em

    aplicações CPU-bound e abrir um leque de oportunidades para a linguagem.
  45. Além disso te permite compreender o funcionamento de ferramentas do

    ecossistema moderno da linguagem e, quem sabe, não criar a sua própria ferramenta.