Uma interface limpa e responsiva para informações do Zend OPcache, mostrando estatísticas, configurações e arquivos em cache, além de fornecer atualização em tempo real das informações.
Esta interface usa ReactJS e Axios e é para navegadores modernos, e requer no mínimo PHP 7.1.
MIT: http://acollington.mit-license.org/
Se você puder e quiser patrocinar este trabalho de alguma forma, isso seria incrível. Você pode fazer isso através da página de patrocínio do GitHub.
Alternativamente, se você quiser apenas me avisar no X (também conhecido como Twitter) para dizer que você o usa, isso também seria incrível! (Alguém mais sente falta de cartões postais?)
Existem duas maneiras de começar a usar esta interface:
A maneira mais fácil de começar a usar o opcache-gui é clonar este repositório ou simplesmente copiar/colar/baixar o arquivo index.php
em um local que seu servidor web possa carregar. Em seguida, aponte seu navegador para esse local, como https://www.example.com/opcache/index.php
.
Você pode incluir os arquivos com o Composer executando o comando composer require amnuts/opcache-gui
.
Uma vez no diretório vendor
, há inúmeras maneiras de usar a interface. Por exemplo, se você estiver usando um framework como Symfony ou Laravel, você pode carregar opcache-gui em um Controller
. Seus requisitos para configurá-lo dentro da estrutura de sua escolha irão variar, então não é realmente possível detalhar como fazer isso neste leia-me... mas tenho fé na sua capacidade de descobrir isso!
O namespace usado para a classe é AmnutsOpcache
, então, quando a dependência estiver em seu autoload.php
você poderá usar a classe AmnutsOpcacheService
. Por exemplo, você poderia fazer algo como:
<?php
use Amnuts Opcache Service ;
// assuming location of: /var/www/html/opcache.php
require_once __DIR__ . ' /../vendor/autoload.php ' ;
// specify any options you want different from the defaults, if any
$ options = [ /* ... */ ];
// setup the class and pass in your options, if you have any
$ opcache = ( new Service ( $ options ))-> handle ();
Então você pode criar qualquer visualização que desejar para mostrar os detalhes do opcache. Embora exista uma interface baseada em React bastante interessante disponível para você neste repositório.
Alternativamente, inclua vendor/amnuts/opcache-gui/index.php
diretamente e isso lhe dará o mesmo resultado que apenas copiar/colar o index.php
em algum lugar.
<?php
// assuming location of: /var/www/html/opcache.php
require_once __DIR__ . ' /../vendor/amnuts/opcache-gui/index.php ' ;
Você pode simplesmente criar um link simbólico para o index.php
que está no diretório vendor
:
ln -s /var/www/vendor/amnuts/opcache-gui/index.php /var/www/html/opcache.php
Basicamente, há muitas maneiras de colocar a interface em funcionamento - escolha a que melhor se adapta às suas necessidades.
A configuração padrão da interface é assim:
$ options = [
' allow_filelist ' => true , // show/hide the files tab
' allow_invalidate ' => true , // give a link to invalidate files
' allow_reset ' => true , // give option to reset the whole cache
' allow_realtime ' => true , // give option to enable/disable real-time updates
' refresh_time ' => 5 , // how often the data will refresh, in seconds
' size_precision ' => 2 , // Digits after decimal point
' size_space ' => false , // have '1MB' or '1 MB' when showing sizes
' charts ' => true , // show gauge chart or just big numbers
' debounce_rate ' => 250 , // milliseconds after key press to send keyup event when filtering
' per_page ' => 200 , // How many results per page to show in the file list, false for no pagination
' cookie_name ' => ' opcachegui ' , // name of cookie
' cookie_ttl ' => 365 , // days to store cookie
' datetime_format ' => ' D, d M Y H:i:s O ' , // Show datetime in this format
' highlight ' => [
' memory ' => true , // show the memory chart/big number
' hits ' => true , // show the hit rate chart/big number
' keys ' => true , // show the keys used chart/big number
' jit ' => true // show the jit buffer chart/big number
],
// json structure of all text strings used, or null for default
' language_pack ' => null
];
Se quiser alterar qualquer um dos padrões, você pode passar apenas aqueles que deseja alterar se quiser manter o restante como está. Basta alterar o array no topo do script index.php
(ou passar o array de forma diferente para a classe Service
).
Por exemplo, o seguinte alteraria apenas os valores allow_reset
e refresh_time
mas manteria todo o resto como padrão:
$ opcache = ( new Service ([
' refresh_time ' => 2 ,
' allow_reset ' => false
]))-> handle ();
Ou este exemplo para dar às abas uma sensação um pouco mais "pirateada":
$ opcache = ( new Service ([
' language_pack ' => <<<EOJSON
{
"Overview": "Crows nest",
"Cached": "Thar Booty",
"Ignored": "The Black Spot",
"Preloaded": "Ready an' waitin', Cap'n",
"Reset cache": "Be gone, yer scurvy dogs!",
"Enable real-time update": "Keep a weathered eye",
"Disable real-time update": "Avert yer eyes, sea dog!"
}
EOJSON
]))-> handle ();
A visão geral mostrará todas as informações principais. A partir daqui você poderá ver em qual host e plataforma você está executando, qual versão do OPcache você está usando, quando foi reiniciado pela última vez, as funções e diretivas disponíveis (com links para o manual do php.net), e todas as estatísticas associadas ao OPcache (número de acessos, memória usada, memória livre e desperdiçada e muito mais).
Todos os arquivos atualmente no cache são listados aqui com suas estatísticas associadas.
Você pode filtrar os resultados para ajudar a encontrar os scripts específicos que está procurando e alterar a forma como os arquivos em cache são classificados. A partir daqui você pode invalidar o cache de arquivos individuais ou invalidar o cache de todos os arquivos que correspondem à sua pesquisa.
Se você não quiser mostrar a lista de arquivos, poderá usar a opção de configuração allow_filelist
; defini-lo como false
suprimirá completamente a lista de arquivos.
Se quiser ajustar o comprimento da paginação, você pode fazer isso com a opção de configuração per_page
.
Se você configurou uma lista de arquivos que não deseja armazenar em cache, fornecendo um valor opcache.blacklist_filename
, a lista de arquivos será listada nesta guia.
Se você não forneceu essa opção de configuração no arquivo php.ini
, esta guia não será exibida. Se você definir a opção de configuração allow_filelist
como false
, esta guia não será exibida, independentemente da sua configuração ini.
O PHP 7.4 introduziu a capacidade de pré-carregar um conjunto de arquivos na inicialização do servidor por meio da configuração opcache.preload
em seu arquivo php.ini
. Se você configurou isso, a lista de arquivos pré-carregados especificamente será listada nesta guia.
Assim como acontece com o arquivo ignorado, se você não forneceu a configuração ini ou se a opção de configuração allow_filelist
for false
, essa guia não será exibida.
Você pode redefinir todo o cache, bem como forçar a invalidação de arquivos individuais ou grupos de arquivos para que sejam armazenados em cache novamente.
A redefinição pode ser desabilitada com o uso das opções de configuração allow_reset
e allow_invalidate
.
A interface pode pesquisar de vez em quando para obter uma nova visão do opcache. Você pode alterar a frequência com que isso acontece com a opção de configuração refresh_time
, que está em segundos.
Quando as atualizações em tempo real estiverem ativas, a interface atualizará automaticamente todos os valores conforme necessário.
Além disso, se você optar por invalidar qualquer arquivo ou redefinir o cache, isso será feito sem recarregar a página, de modo que o termo de pesquisa inserido ou a página para a qual você navegou não sejam redefinidos. Se a atualização em tempo real não estiver ativada, a página será recarregada em qualquer uso de invalidação.
A interface foi projetada com base no princípio de ter apenas um arquivo que qualquer pessoa precisa para começar a trabalhar. Para isso, existe um arquivo de template, arquivos de linguagem, jsx e css, que são usados para criar a interface e são reunidos no processo de construção.
Este processo de construção permitirá que você altere a linguagem usada, como as bibliotecas javascript de terceiros necessárias são incluídas, a aparência ou até mesmo os componentes principais, se desejar.
Para executar o processo de construção, execute o comando php ./build/build.php
na raiz do repositório (você precisará nodejs
e npm
já instalados). Depois de executar, você deverá ver a saída algo como:
Installing node modules
Building js and css
Creating single build file
Using remote js links from 'cloudflare'
Done!
O script de construção só precisará instalar node_modules
uma vez, portanto, nas compilações subsequentes, deverá ser um pouco mais rápido!
O processo de construção criará um arquivo css compilado em build/interface.css
e o javascript da interface estará em build/interface.js
. Você provavelmente poderia usar ambos em suas próprias estruturas e sistemas de modelos, se desejar.
O CSS da interface está no arquivo build/_frontend/interface.scss
. Faça alterações lá se quiser alterar as cores ou a formatação.
Se você fizer alguma alteração no arquivo scss, precisará executar o script de construção para ver as alterações.
Se você quiser alterar a interface em si, atualize o arquivo build/_frontend/interface.jsx
- é basicamente um conjunto de componentes ReactJS. É aqui que você pode alterar o layout do widget, como funciona a lista de arquivos, paginação, etc.
Execute o script de construção novamente caso faça alterações aqui.
O modelo PHP wrapper usado no processo de construção, e que atua para passar vários bits de dados para o lado ReactJS, está localizado em build/template.phps
. Se você quiser atualizar a versão do ReactJS usada ou como o html do wrapper está estruturado (como querer passar coisas adicionais para o lado do ReactJS), então este seria o arquivo que você deseja atualizar.
A interface requer alguns arquivos js de terceiros para funcionar corretamente. Você tem a opção de alterar onde eles são buscados (entre CloudFare, JSDelivr e Unpkg) ou pode ter js js completamente local e em linha (por exemplo, você tem políticas CSP em vigor e os URLs remotos são não está na lista de permissões).
Para alterar a localização dos recursos de terceiros, use a opção -r
ou --remote-js
seguida de cloudflare
, jsdelivr
ou unpkg
. Por exemplo, se você quisesse usar jsdelivr , você executaria o comando build assim: php ./build/build.php -r jsdelivr
. O padrão é cloudflare
.
Se você quiser ter o js alinhado, poderá usar o sinalizador -j
ou --local-js
ao compilar, como php ./build/build.php -j
. Isso irá buscar os arquivos de script remoto e incorporar o js no arquivo index.php
principal. Se você quiser compilá-lo novamente com arquivos remotos, execute o comando novamente sem o sinalizador. A busca dos arquivos levará em consideração sua opção -r
se você a fornecer.
Há um velho ditado que diz: “Se você conhece mais de um idioma, você é multilíngue; se não, você é britânico”. Isso não é apenas uma acusação contundente da mentalidade britânica em relação a outras línguas, mas também explica por que a UI só até agora está em inglês - porque eu sou, apesar de todos os meus pecados, britânico.
Porém, agora é possível construir a interface com uma linguagem diferente. Atualmente, graças aos colaboradores, o francês e o espanhol também são suportados. Se alguém quiser contribuir com pacotes de idiomas adicionais, envie um PR!
Se o pacote de idiomas estiver no diretório build/_languages/
então você poderá usá-lo com o sinalizador -l
ou --lang
. Por exemplo, se houver um pacote de idiomas fr.json
, você poderá usar php ./build/build.php -l fr
para construir com esse idioma.
Alguns scripts de composição foram adicionados para ajudar na construção. Eles são composer build
, composer build-french
e composer build-spanish
.
Se você deseja criar um arquivo de idioma, build/_languages/example.json
contém tudo que você precisa. É uma estrutura json simples com a chave sendo a versão em inglês que corresponde ao que está na IU, e o valor é para o que você está convertendo - que no arquivo de exemplo está apenas em branco. Se um valor estiver vazio ou o índice não existir para uma tradução, então será usada apenas a versão em inglês. Isso lhe dá a capacidade de substituir algumas ou todas as strings da interface conforme achar necessário.
Para começar com um novo idioma, copie example.json
para o idioma desejado que ainda não existe - por exemplo, pt-br.json
ou pirate.json
. Em seguida, preencha as traduções nos valores. Uma vez feito isso, reconstrua com php ./build/build.php -l pt-br
ou php ./build/build.php -l pirate
.
Versão 3.5.5
Adicionadas traduções para o espanhol graças a @ cvc90 (PR#110)
Versão 3.5.4
Melhor controle sobre se o JIT está habilitado ou desabilitado. Agora também mostra por que ele pode estar desativado mesmo se a configuração estiver ativada. A interface também desativa o gráfico e as estatísticas de memória corretamente para JIT se estiver desativado por qualquer motivo.
Versão 3.5.3
Resolvi algumas inconsistências com links na documentação do opcache no php.net.
Versão 3.5.2
Removidos alguns avisos do PHP 8.2 eliminando o namespace
e as instruções use
no arquivo index.php
incluído.
Versão 3.5.1
Este é apenas 3.5.0, mas com tags de versão corrigidas para deixar o Packagist feliz e corrigir meu erro.
Versão 3.5.0
Esta versão altera a forma como o processo de construção inclui o javascript.
-j
/ --local-js
agora incorpora o javascript no arquivo index.php
em vez de tê-los como arquivos separados-r
/ --remote-js
foi adicionada para permitir que você decida de onde obter os arquivos de terceiros (quando buscados localmente ou quando adicionados como links de script remoto), com cloudflare
, jsdelivr
ou unpkg
disponíveis opções Versão 3.4.0
Esta versão adiciona um pouco mais de informações sobre os arquivos no cache e permite um pouco mais de configuração por meio do script de configuração e construção.
datetime_format
para formatação flexível de valores de data/horamodified
do arquivo em cache à saída (quando o arquivo foi adicionado ou atualizado)index.php
com os arquivos js locais em vez de URLs remotos Versão 3.3.1
Apenas alguns pequenos ajustes:
Versão 3.3.0
Informações JIT adicionadas principalmente para PHP 8:
false
Se você deseja ativar o JIT, você deve inserir um valor para a configuração opcache.jit_buffer_size ini, caso contrário, ele será desativado por padrão.
Se você não estiver usando PHP 8, a interface compensará e não mostrará as informações adicionais do JIT.
Versão 3.2.1
Liberação de manutenção secundária para:
Versão 3.2.0
Atualizado o ReactJS para as versões minificadas mais recentes e usadas e feita uma pequena melhoria na opção de classificação quando nenhuma paginação está presente.
Versão 3.1.0
Adicionada a capacidade de classificar a lista de arquivos em cache de várias maneiras.
Versão 3.0.1
Uma pequena atualização que usará http ou https para obter as bibliotecas javascript, dependendo do que você estiver usando.
Versão 3.0.0
Embora a interface pareça praticamente a mesma, ela foi completamente reescrita nos bastidores! Algumas das mudanças mais notáveis são:
Versão 2.5.4
Posicionamento refinado do namespace css inicial para funcionar bem no plugin Moodle e possivelmente em outros sistemas. Também ajustou alguns CSS.
Versão 2.5.3
Nomes de classes CSS foram adicionados e regras de estilo atualizadas para usá-los.
Versão 2.5.2
Hotfix para os valores de optimisation_level que foram lançados na v2.5.1.
Versão 2.5.1
Algumas correções de bugs e melhorias nos detalhes do nível de otimização.
Versão 2.5.0
Adicionado um novo gráfico de destaque para mostrar a porcentagem de chaves em cache com opções para ativar/desativar os gráficos de destaque individuais.
Versão 2.4.1
Principalmente correções de bugs
memory_consumption
e max_file_size
agora são exibidas como tamanhos legíveis por humanosfile_cache_only
estiver ativo Versão 2.4.0
Adiciona armazenamento de cookies para o estado em tempo real, permitindo que o tempo real seja ativado no carregamento. O nome do cookie e o comprimento do TTL podem ser ajustados na configuração
Versão 2.3.0
Adiciona informações para strings internas e compatibilidade com PHP 5.4
Versão 2.2.2
Traz otimizações para a listagem de arquivos durante a filtragem
Versão 2.2.1
Os medidores agora estão sendo atualizados com o pulso em tempo real e alguns problemas de arredondamento foram corrigidos
Versão 2.2.0
Fornece a capacidade de ativar/desativar a lista de arquivos (o padrão é ativado)
Versão 2.1.0
Agora fornece uma maneira muito mais fácil de configurar algumas opções, seja o tempo de pesquisa, alternar a capacidade de redefinir o cache, atualizações em tempo real, etc. Também permite mostrar os grandes valores (uso de memória e taxa de acertos) como medidor gráficos em vez de grandes números.
Versão 2.0.0
Apresenta o uso de React.js e fornece a capacidade de atualizar perfeitamente mais informações em tempo real (bem, a cada cinco segundos por padrão) - então agora os arquivos, bem como a visão geral, são atualizados. O visual é atualizado, removendo os gradientes e dando um toque mais plano. E o código em geral passou por uma reformulação.
As versões da GUI estão disponíveis em:
https://github.com/amnuts/opcache-gui/releases/
Várias pessoas questionaram se o opcache-gui está funcionando em sua instância do PHP-FPM, já que os arquivos mostrados não parecem ser tudo o que está em cache, e isso é diferente do que o Apache pode mostrar.
Essencialmente, esse é o comportamento esperado. E graças a um ótimo comentário do colaborador Michang, esta explicação deve cobrir a diferença:
A interface só pode mostrar o que sabe sobre o uso do OPcache de sua própria instância do OPcache, portanto, quando é acessada através do Apache com mod_php, ela só pode ver o uso do OPcache daquela instância do OPcache do servidor web Apache. Quando é acessado com CGI clássico, ele só pode ser armazenado em cache quando uma nova instância de PHP e OPcache é criada; nesse caso, o próprio OPcache geralmente não faz sentido.
Para poder monitorar e gerenciar o OPcache para todas as aplicações web, todas precisam usar o mesmo FastCGI, ou seja, instância PHP-FPM.
No caso do Apache, muitas vezes é necessário configurá-lo ativamente para não usar seu mod_php interno, mas enviar solicitações de manipulador PHP para o servidor PHP-FPM compartilhado via mod_proxy_fcgi, o que também requer o uso do evento MPM. Essa é geralmente vista como a configuração preferida hoje em dia, especialmente para sites de alto tráfego. Isso ocorre porque cada solicitação recebida com MPM prefork + mod_php cria um processo filho próprio, consumindo tempo e memória adicionais, enquanto com MPM de evento e servidor PHP-FPM dedicado, um thread de manipulador (geralmente) já em espera é usado no Apache e no final do PHP, consumindo quase nenhuma memória ou tempo adicional para a geração do processo.
O script requer PHP 7.1 ou superior. Não estou tentado a fazer o downgrade do código para torná-lo compatível com a versão 7.0 e espero que a maioria das pessoas já tenha atualizado. Mas eu realmente aprecio que às vezes as pessoas simplesmente não conseguem alterar a versão do PHP que usam porque está fora de seu controle. Portanto, se você for um dos azarados, poderá fazer as seguintes alterações em index.php
(ou Service.php
e executar o script de construção). Para as linhas:
public function getOption(?string $name = null)
public function getData(?string $section = null, ?string $property = null)
public function resetCache(?string $file = null): bool
Será apenas o caso de remover o ?
de cada um dos parâmetros.