de Informação (Unipar) ➔ Especialista em desenvolvimento web e mobile (Alfa Umuarama) ➔ Desenvolvedor há quase 10 anos ➔ Engenheiro de Software no PagSeguro Internacional (antigo BoaCompra) ➔ Apaixonado por futebol 🌴👍🌍 e esporte eletrônico (CS:GO) 🔫 @renandelmonico @renandelmonico /renandelmonico /renandelmonico /renandelmonico [email protected]
◆ A cada request o PHP “compila” todos os arquivos que serão utilizados e depois executa as operações ➔ Não tem uma compilação “manual” ◆ Automágica 🧙 a cada request
➔ Melhora a performance do PHP armazenando o script em bytecode em memória RAM, removendo assim a necessidade de fazer a compilação a CADA request ➔ Sem o opcache todo o código compilado após a request é “descartado” sendo necessária a compilação novamente em uma nova requisição ➔ Em produção os opcodes não mudam ◆ A cada novo deploy é gerada uma nova imagem, com o novo código ➔ Existe desde o PHP 5.5 ➔ Zend Optimizer ◆ “doado” pela Zend
com anabolizante ➔ Permite que você diga ao PHP FPM para gerar os opcodes e jogar no cache antes de executar qualquer código na Zend VM ➔ Zend VM? ◆ Depois dos opcodes gerados quem executa é a Zend VM ➔ ⚠ Não funciona no Windows ◆ Servidores em prod quase sempre são Linux! ➔ Depois disso ainda temos o JIT!
a obtenção dos opcodes seja mais rápida para execução na Zend VM, o JIT faz com que os códigos sejam executados sem VM 🥰 ➔ Zend VM foi escrita em C e funciona como uma camada entre o opcode e o CPU, o JIT gera um código compilado em tempo de execução para que o PHP “pule” a Zend VM ➔ Implementação usa a lib DynASM (Dynamic Assembler) ◆ O JIT compiler transforma os opcodes em código de máquina específico da arquitetura da CPU usando o DynASM
essa é a principal) essa é a única configuração que você irá alterar ➔ Cada posição desse número tem um significado ◆ É confuso? É. Mas é o que tem pra hoje ◆ De acordo com a lista do RFC, esse é o significado de cada número… ◆ A ordem das tabelas é da direita para esquerda
all function on script load 1 Compile function on first execution 2 Profile functions on first request and compile the hottest functions afterwards 3 Profile on the fly and compile hot functions 4 Currently unused 5 Use tracing JIT. Profile on the fly and compile traces for hot code segments
a melhor configuração é a 1255 ➔ A opção opcache.jit é opcional, se não informada será considerado o valor padrão ➔ E qual o valor padrão? ◆ opcache.jit=tracing ➔ Uai sô, mas não era aqueles numerozinhos marotos? ◆ Depois de aprovada a RFC, chegaram na conclusão que as opções não eram user-friendly, então refizeram tudo adicionaram dois alias que são “traduzidos” para os numerozinhos marotos. • opcache.jit=tracing • opcache.jit=function ➔ A diferença entre os dois é que function o JIT irá tentar otimizar somente o código dentro de um escopo de uma única função, enquanto o tracing faz o trace (ah, vá!) toda a pilha para identificar e otimizar o código. ➔ É recomendado o uso do trace, pois quase sempre apresentará resultados melhores