Do not speak Portuguese? Translate this site with Google or Bing Translator
Acelerando o PHP com OPcache

Posted on: May 20, 2022 08:20 PM

Posted by: Renato

Categories: PHP Dicas developer devops

Views: 305

Acelerando o PHP com OPcache

O que é o OPcache?

O OPcache é uma forma de acelerar seus scripts em PHP. Quando um script PHP é executado, ele precisa ser convertido para um formato intermediário que o interpretador do PHP entenda, o chamado "opcode" (ou "código de operação"). Por padrão, o opcode de um script é descartado ao final de sua execução. Ou seja, toda vez que um visitante acessa uma página PHP do seu site, esse processo precisa ser repetido. Mas e se fosse possível reaproveitar o opcode entre um acesso e outro? É aí que entra o OPcache!

Como ele funciona?

O que o OPcache faz é, após um script ser compilado para opcode pelo PHP, esse opcode é armazenado na memória para uso futuro (a parte do "cache"). Quando um usuário acessa novamente esse script no seu site, o opcode já está disponível, não é necessário refazê-lo. Isso acelera tremendamente a execução de scripts em PHP, deixando seu site mais rápido. Você pode usar esse recurso para acelerar seu site em WordPress, Magento, Joomla!, entre vários outros.

O OPcache também é um otimizador de opcode, ou seja, além da função de cache, ele também simplifica o código em termos de uso de processamento e memória!

Otimizando aplicações php com opcache.

O que é o Opcache?

O OpCache aumenta a performance de execução de código php (> 5.5) guardando um cache compartilhado em memória do código pré-compilado a partir dos scripts da aplicação.

Uma das soluções de métricas que tenho utilizado é o new relic (também pode usar o xdebug + kCachegrind em dev, mas o xdebug deixa o tempo de resposta mais lento). Com base no agente do new relic, tenho acesso ao tempo de resposta das máquinas sem considerar a latência da rede.

Após colocarmos em produção uma loja com magento2 em uma aws c4.2xlarge, com php7, efetuei a configuração do OpCache.

zend_extension=opcache.so
opcache.enable=1
opcache.validate_timestamps=0
opcache.max_accelerated_files=65406
opcache.memory_consumption=256
opcache.interned_strings_buffer=12
opcache.fast_shutdown=1
opcache.enable_file_override=1
opcache.error_log=/var/log/php-opcache-error.log

Basicamente, temos:

enable: Ativa o OpCache.
validate_timestamps: Esta definição informa se o php deve ficar reavaliando se o arquivo do script foi atualizado, deve ser ativado apenas em produção. Ao realizar novos deploys, é necessário reiniciar o webserver(nginx ou apache). Do contrário o OpCache vai ignorar as alterações de arquivos.
max_accelerated_files: A quantidade de arquivos que o OpCache deve guardar em memória, deve-se tomar cuidado, calcula-se a quantidade de arquivos, incluindo seus vendor packages.
memory_consumption: A quantidade de memória disponível que o OpCache poderá alocar para guardar os arquivos em memória.
interned_strings_buffer: A quantidade de memória que o OpCache utilizará para bufferizar strings.sua
enable_file_override: Se o opcache não deve validar a existência do arquivo origem do script cacheado.
fast_shutdown: Permite a zend engine memory manager gerenciar a opcache.max_accelerated_files=3000alocação de variáveis da requisição.
error_log: Um arquivo de log para erros oriundos da utilização do OpCache.

Resultado:

De praticamente 500ms passou para algo em torno de 150ms. As condições de troughput eram em torno de 50–60 requests por minuto da home da loja.

Além do magento2, ajustei outra api construída com o microframework silex, rodando também em php7 (fpm). As configurações mudam pouco, muito menos arquivos e memória para alocar.

zend_extension=opcache.so
opcache.enable=1
opcache.validate_timestamps=0
opcache.max_accelerated_files=3000
opcache.memory_consumption=64
opcache.interned_strings_buffer=12
opcache.fast_shutdown=1
opcache.enable_file_override=1
opcache.error_log=/var/log/php-opcache-error.log

Este foi o resultado:

De ~125ms passou para ~25ms em uma aws m3.medium (sem considerar os picos do banco de dados em amarelo). O endpoint estático de checagem da saúde da api responde em 8ms depois da configuração (antes respondia em ~28ms).

Resumo: Fácil de configurar, fácil de ver resultados logo após a configuração, só alegria.

Referências:

Opcache: http://php.net/manual/en/book.opcache.php

Definições de configuração completas do OpCache: http://php.net/manual/en/opcache.configuration.php


4

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (12) Variados (109) PHP (108) Laravel (116) Black Hat (3) front-end (25) linux (86) postgresql (35) Docker (14) rest (4) soap (1) webservice (6) October (1) CMS (2) node (7) backend (10) ubuntu (41) devops (22) nodejs (5) npm (2) nvm (1) git (4) firefox (1) react (6) reactnative (5) collections (1) javascript (5) reactjs (7) yarn (0) adb (1) solid (0) blade (2) models (1) controllers (0) log (0) html (2) hardware (2) aws (14) Transcribe (2) transcription (1) google (3) ibm (1) nuance (1) PHP Swoole (4) mysql (22) macox (2) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (2) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (13) faceapp (1) eloquent (11) query (2) sql (35) ddd (3) nginx (6) apache (4) certbot (1) lets-encrypt (2) debian (9) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (1) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (2) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (1) binaural (1) mysqli (3) database (33) windows (2) vala (1) json (2) oracle (1) mariadb (2) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (1) piada (1) cron (2) dba (13) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (3) bash (2) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (0) biologia (1) programming (20) performance (2) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (1) microg (1) iode (1) ssh (1) zsh (1) terminal (1) dracula (1) spaceship (1) mac (1) idiomas (1) laptop (1) developer (27) api (1) data (1) matematica (1) seguranca (2) 100DaysOfCode (6) hotfix (1) documentation (1) laravel (2) RabbitMQ (1) Elasticsearch (1) redis (1) Raspberry (3) Padrao de design (4) JQuery (1) angularjs (2) Dicas (12) kubenetes (1) vscode (1) backup (1) angular (1) servers (2) pipelines (1) AppSec (1) DevSecOps (2) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (1) security (1) translate (1) kube (1) iot (1) politica (1) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (2) traefik (1) networking (1) host (1) POO (1) microservices (1) bug (1) cqrs (1) arquitetura (1) Architecture (1)

New Articles



Get Latest Updates by Email