Back-End

5 fev, 2016

Como limpar o Opcache do PHP

100 visualizações
Publicidade

O PHP pode ser configurado para armazenar código de bytes pré-compilados na memória compartilhada, chamada Opcache. Ela impede o carregamento e a análise de scripts PHP em cada solicitação. Este artigo irá dizer-lhe como liberar o Opcache bytecode, se você precisar dele.

Você pode querer liberar o APC (PHP <5.5) ou o Opcache (PHP> = 5.5) no PHP quando se tem em cache o código que você deseja atualizar. A partir do PHP 5.5, o cache do APC foi substituído pelo Opcache, e o APC só existe como um cache de chave/valor para o usuário, e não mais como um cache de bytecode.

Determine seu método PHP

Você pode executar o PHP de várias maneiras. Nos últimos anos, o PHP evoluiu para novos métodos, que vão desde CGI para FastCGI para mod_php e PHP-FPM. Liberar seu Opcache depende de como você executa seu PHP.

Se você quiser uma maneira uniforme de liberar seu Opcache, poderá criar um arquivo PHP chamado flush_cache.php em ​​seu diretório root com um conteúdo como este.

<?php
opcache_reset();
?>

Toda vez que você deseja liberar seu Opcache, você pode navegar até esse arquivo, e ele vai executar opcache_reset(); em todo o seu Opcache. A próxima requisição PHP para o seu site vai preencher o cache novamente.

É importante que você chame isso via URL da mesma maneira que você chega ao seu site, quer seja via um HTTP:// ou HTTPS://. Executar o arquivo php flush_cache.php na linha de comando não irá liberar o cache de seus processos em execução.

Isso pode ser parte de seu processo de implantação, no qual após cada alteração você pode executar curl em uma URL particular.

Se você quer uma solução do lado do servidor, vá mais longe.

PHP rodando como CGI ou FastCGI

Liberar o Opcache com CGI ou FastCGI PHP é super simples: isso não pode ser feito.

Não é porque você não pode liberar o cache, mas porque o cache é liberado em cada solicitação de qualquer forma. O FastCGI inicia um novo processo php-cgi em cada pedido e não tem um processo PHP pai para armazenar os resultados do Opcache.

Na verdade, ter o Opcache sendo executado em um modelo CGI ou FastCGI iria prejudicar o desempenho: em cada solicitação, o Opcache é armazenado no processo do FastCGI (este é um comportamento padrão se a extensão Opcache estiver ativada), mas o cache é destruído logo que o processo morre depois de terminar o pedido.

Armazenar o Opcache leva alguns ciclos de CPU e é um esforço que não pode ser beneficiado de novo mais tarde.

CGI ou FastCGI é a pior maneira possível para executar seu código PHP.

PHP em execução na linha de comando

Todos os métodos PHP que são executados na linha de comando não têm Opcache. Ele pode ser ativado e o PHP pode tentar armazenar o Opcache na memória, mas, assim que o seu comando terminar de ser executado, o cache estará bem.

Para limpar a Opcache na linha de comando, basta reiniciar o comando PHP. Geralmente é tão simples como CTRL+C para interromper o comando e iniciá-lo novamente.

Pela mesma razão, executar o PHP como CGI ou FastCGI, tendo o Opcache habilitado para pedidos em linha de comando, iria prejudicar o desempenho mais do que você ganharia benefícios a partir dele.

Apache rodando como mod_php

Se você executar o Apache, poderá executar o PHP por incorporação de um módulo dentro do seu servidor web Apache. Por padrão, o PHP é executado como o mesmo usuário do seu servidor web Apache que está em execução.

Para liberar o Opcache em um cenário mod_php, você pode recarregar ou reiniciar o servidor web Apache.

$ service httpd reload
$ apachectl graceful

Recarregar o serviço deve ser suficiente, uma vez que irá limpar o Opcache do PHP. Um reinício também irá funcionar, mas é mais invasivo, uma vez que mata todas as conexões HTTP ativas.

PHP rodando como PHP-FPM

Se você executar o seu PHP como PHP-FPM, pode enviar uma recarga para o seu daemon PHP-FPM. A recarga irá liberar o Opcache e forçá-lo a ser reconstruído na primeira solicitação de entrada.

$ service php-fpm reload

Se você estiver executando o múltiplas instâncias PHP mestres, você pode recarregar um único mestre para redefinir só o Opcache mestre. Por padrão, ele irá liberar o cache inteiro, não importa quantos sites você tenha em execução.

Se você quer mais controle na linha de comando, pode usar uma ferramenta como cachetool, que pode se conectar ao seu soquete PHP-FPM e enviar-lhe comandos, da mesma forma que um servidor web faria.

Primeiro, baixe o phar que você pode usar para manipular o cache.

$ curl -sO http://gordalina.github.io/cachetool/downloads/cachetool.phar

Em seguida, use esse phar para enviar comandos para o seu daemon PHP-FPM.

$ php cachetool.phar opcache:reset --fcgi=127.0.0.1:9000
$ php cachetool.phar opcache:reset --fcgi=/var/run/php5-fpm.sock

Usar algo como cachetool também pode ser facilmente integrado em seu processo de implantação automatizado.

***

Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/how-to-clear-php-opcache/