Como usar o PHP OPCache?

249

O PHP 5.5 foi lançado e possui um novo módulo de cache de código chamado OPCache, mas não parece haver nenhuma documentação para ele.

Então, onde está a documentação e como uso o OPcache?

Danack
fonte
4
Documentação: php.net/manual/pt/book.opcache.php
David Oliver
Pena que a documentação NÃO nos diz como compilar o opcache corretamente / desabilitá-lo nem solucionar o autoconf da fonte PHP 5.6.24+, para que o PHP compile! :-(
Filip OvertoneSinger Rydlo
@ Fred-ii- "Existem muitas configurações que podem precisar de ajustes. Compreender como funciona e identificar problemas durante a fase de estabilização do processo de lançamento do PHP 5.5 ajudará bastante." ... Essa postagem no blog não é muito útil. Ele não explica como entender como funciona ou qual a melhor forma de ajustar as configurações :(
icc97 16/17

Respostas:

371

Instalação

O OpCache é compilado por padrão no PHP5.5 +. No entanto, está desativado por padrão. Para começar a usar o OpCache no PHP5.5 +, primeiro você deverá habilitá-lo. Para fazer isso, você teria que fazer o seguinte.

Adicione a seguinte linha ao seu php.ini:

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

Observe que quando o caminho contém espaços, você deve colocá-lo entre aspas:

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

Observe também que você terá que usar a zend_extensiondiretiva em vez da diretiva "normal" extensionporque isso afeta o mecanismo Zend real (isto é, o que executa o PHP).

Uso

Atualmente, existem quatro funções que você pode usar:

opcache_get_configuration():

Retorna uma matriz que contém a configuração usada atualmente pelo OpCache. Isso inclui todas as configurações ini, além de informações sobre versão e arquivos na lista negra.

var_dump(opcache_get_configuration());

opcache_get_status():

Isso retornará uma matriz com informações sobre o status atual do cache. Esta informação incluirá coisas como: o estado em que o cache está (ativado, reiniciado, cheio etc), o uso de memória, ocorrências, erros e algumas informações mais úteis. Ele também conterá os scripts em cache.

var_dump(opcache_get_status());

opcache_reset():

Redefine o cache inteiro. Significando que todos os scripts em cache possíveis serão analisados ​​novamente na próxima visita.

opcache_reset();

opcache_invalidate():

Invalida um script em cache específico. Significando que o script será analisado novamente na próxima visita.

opcache_invalidate('/path/to/script/to/invalidate.php', true);

Manutenção e relatórios

Existem algumas GUIs criadas para ajudar a manter o OpCache e gerar relatórios úteis. Essas ferramentas aproveitam as funções acima.

OpCacheGUI

Isenção de responsabilidade Eu sou o autor deste projeto

Recursos:

  • Status do OpCache
  • Configuração do OpCache
  • Estatísticas do OpCache
  • Redefinição do OpCache
  • Visão geral de scripts em cache
  • Invalidação de scripts em cache
  • Multilíngue
  • Suporte para dispositivo móvel
  • Gráficos brilhantes

Imagens:

status

scripts em cache

gráficos

mobilr

URL: https://github.com/PeeHaa/OpCacheGUI

opcache-status

Recursos:

  • Status do OpCache
  • Configuração do OpCache
  • Estatísticas do OpCache
  • Visão geral de scripts em cache
  • Único arquivo

Captura de tela:

status

URL: https://github.com/rlerdorf/opcache-status

opcache-gui

Recursos:

  • Status do OpCache
  • Configuração do OpCache
  • Estatísticas do OpCache
  • Redefinição do OpCache
  • Visão geral de scripts em cache
  • Invalidação de scripts em cache
  • Atualização automática

Captura de tela:

Visão geral do opcache-gui

URL: https://github.com/amnuts/opcache-gui

PeeHaa
fonte
6
Alguma coisa em relação ao PHP-CLI? Como a CLI utiliza? Quando o FPM é reiniciado, o OPCache é redefinido - isso também afeta o OPCache da CLI? O OPCache da CLI é separado ou compartilha o mesmo pool de cache com o FPM? Obrigado!
Shahriyar Imanov 25/02
3
O OpCache foi ativado por padrão para mim na minha instalação mais recente no ubuntu 14.04, apache 2.4.7, php 5.5.9.
Jstats 20/05
oi, na sua terceira captura de tela, cache_full é falso, estou assumindo que está relacionado ao cache de página inteira, você poderia me dizer como ativá-lo? (torná-la verdadeira)
brucekaushik
Estou errado, isso não é para armazenar em cache a página inteira, mas será exibido se a memória usada pelo cache estiver cheia. Obrigado de qualquer forma!
brucekaushik
zend_extension = C: \ caminho \ para \ php_opcache.dll (win) - A adição desta linha no php.ini funciona bem.
Kalidasan
152

OPcache substitui APC

Como o OPcache foi projetado para substituir o módulo APC, não é possível executá-los em paralelo no PHP. Isso é bom para armazenar em cache o código de operação do PHP, pois não afeta a maneira como você escreve o código.

No entanto, isso significa que se você estiver usando o APC no momento para armazenar outros dados (por meio da apc_store()função), não poderá fazer isso se decidir usar o OPCache.

Você precisará usar outra biblioteca, como APCu ou Yac, que armazena dados na memória PHP compartilhada ou alterna para usar algo como memcached, que armazena dados na memória em um processo separado para PHP.

Além disso, o OPcache não tem equivalente ao medidor de progresso do upload presente na APC. Em vez disso, você deve usar o andamento do upload da sessão .

Configurações para OPcache

A documentação do OPcache pode ser encontrada aqui com todas as opções de configuração listadas aqui . As configurações recomendadas são:

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings 
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1

Se você usar qualquer biblioteca ou código que use anotações de código, deverá ativar os comentários salvos:

opcache.save_comments=1

Se desativado, todos os comentários do PHPDoc são eliminados do código para reduzir o tamanho do código otimizado. Desativar "Comentários do Doc" pode quebrar alguns aplicativos e estruturas existentes (por exemplo, Doctrine, ZF2, PHPUnit)

Danack
fonte
4
Essas configurações são recomendadas para ambientes de produção, desenvolvimento ou ambos?
Marcvangend
1
Talvez um mal-entendido da minha parte sobre o que exatamente é o opcache e para que é usado, mas eu o configurei e testei com o script de status do PeeHaa abaixo. Tudo está funcionando. Mas ainda estou fazendo a pergunta do OP. "Como usá-lo?" Não é para cache de visualizações e o que é?
isimmons
3
@isimmons "O OPcache melhora o desempenho do PHP armazenando o bytecode de script pré-compilado na memória compartilhada, eliminando assim a necessidade do PHP carregar e analisar scripts em cada solicitação."
Danack 10/10
1
@marcvangend Good point! Eu acho que o cache faz sentido na produção, portanto essas configurações provavelmente são configurações de produção.
Sliq 11/11
3
Alguém pode explicar por que o desempenho recomendado das configurações é pior que o padrão ou quando deve começar a dar efeito?
RP
19

Vou cair em meus dois centavos pelo que uso opcache.

Eu criei uma estrutura extensa com muitos campos e métodos de validação e enumerações para poder conversar com meu banco de dados.

Sem opcache

Ao usar esse script sem o opcache e eu envio 9000 solicitações em 2,8 segundos para o servidor apache, ele atinge o limite de 90 a 100% da CPU por 70 a 80 segundos até alcançar todas as solicitações.

Total time taken: 76085 milliseconds(76 seconds)

Com o opcache ativado

Com o opcache ativado, ele roda em 25-30% do tempo da CPU por cerca de 25 segundos e nunca passa em 25% do uso da CPU.

Total time taken: 26490 milliseconds(26 seconds)

Eu criei um arquivo de lista negra do opcache para desativar o cache de tudo, exceto a estrutura, que é toda estática e não precisa ser alterada de funcionalidade. Escolho explicitamente apenas os arquivos da estrutura para que eu possa desenvolver sem me preocupar em recarregar / validar os arquivos de cache. Manter tudo em cache economiza um segundo no total de solicitações25546 milliseconds

Isso expande significativamente a quantidade de dados / solicitações que eu posso lidar por segundo sem que o servidor sequer se preocupe.

Tschallacka
fonte
3
zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;Apenas substitua o; com uma entrada no arquivo ini. Mas é isso que eu usei. principalmente coisas padrão
Tschallacka
1
btw, me executar este com memcache fazendo 2100 banco de dados solicita uma segunda executa o script eu uso dentro de 150 microssegundos (cerca de 1 / 6th de um milissegundo)
Tschallacka
1
O Opcache armazena em cache os arquivos php na forma compilada na memória. Portanto, você não terá mais sobrecarga de leitura do disco e compilação e otimização de arquivos pelo analisador php. Memcache é algo que você pode usar para armazenar variáveis ​​entre as sessões. Sayt, por exemplo, um usuário possui um script de atualização que solicita os mesmos parâmetros por 10 segundos enquanto o usuário olha para ascreen. Você pode usar o cache de mem para compilar a consulta uma vez e, em seguida, continuar solicitando a consulta compilada a partir da memória, e não a regenerar.
Tschallacka 23/02
2
isso não acontece. opcache.revalidate_freq=60;determina quanto tempo um arquivo pode ficar na memória em segundos. quando o tempo acaba, recompila o arquivo.
Tschallacka 23/02
3
Na verdade, opcache.revalidate_freqcontrola a frequência com que um script é verificado quanto a alterações (com base na alteração do carimbo de data e hora). Portanto, se o carimbo de data e hora de um script permanecer o mesmo da última vez que foi compilado, ele não será recompilado. Tudo isso pressupõe que você não alterou a opcache.validate_timestampsconfiguração, que é ativada por padrão.
jjlin
4

Com o PHP 5.6 no Amazon Linux (deve ser o mesmo no RedHat ou CentOS):

yum install php56-opcache

e depois reinicie o apache.

Roger Dueck
fonte
2

Eu encontrei isso ao configurar o moodle. Eu adicionei as seguintes linhas no arquivo php.ini.

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

intl -> http://php.net/manual/en/book.intl.php

Anoop Toffy
fonte
1
Pode ser interessante notar que essas configurações são documentados aqui: docs.moodle.org/30/en/OPcache
sierrasdetandil
opcache.fast_shutdown = 0 github.com/zendtech/ZendOptimizerPlus/issues/146
Yousha Aleayoub