«

»

fev 23 2016

Imprimir Post

W3 Total Cache com PHP 7 e APCu

Há alguns anos, quando o Skooter Blog ainda era hospedado no HostGator, eu instalei o plugin W3 Total Cache na tentativa de melhorar a velocidade do blog, que estava lento e ficava fora do ar eventualmente, apenas para descobrir que a maioria das funcionalidades dependiam de recursos que o HostGator não oferecia. Deixei-o habilitado com os recursos básicos por bastante tempo, migrei para o Hawk Host posteriormente, e acabei percebendo que o plugin mais atrapalhava que ajudava.

A questão é que praticamente todos os plugins de cache trabalham da seguinte forma: na primeira vez que uma página é acessada, o PHP faz todo o processamento, serve a página para o usuário e guarda uma cópia em disco. Em acessos subsequentes ele acessa diretamente a cópia em disco poupando recursos do servidor. O problema dessa abordagem é que o primeiro acesso, que gerará o cache, é computacionalmente custoso. Em blogs famosos isso é compensado pelos muitos acessos subsequentes que tem custo praticamente nulo e ficam bem mais rápidos.

O problema é que o Skooter Blog não é um site famoso. E você é culpado disso, por não compartilhar o blog com seus amigos :P. Por conta disso, temos muito mais acessos vindo de bots do que de usuários comuns. São tanto bots do bem, como o Googlebot e o Bingbot, que passam por aqui para indexar o blog, quanto os bots do mal, que só querem fazer spam ou buscar alguma falha de segurança. O problema de gerar cache a partir de acessos de bots é que eles acessam muitas páginas diferentes, que provavelmente não terão acessos subsequentes durante a validade do cache. O Skooter Blog tem muito conteúdo, mas grande parte dos acessos diários se concentram em torno de poucos artigos mais famosos. Gerar cache a partir dos acessos dos bots apenas torna esses acessos mais custosos, sem nenhuma vantagem em contrapartida, pois na maioria dos casos não haverão acessos subsequentes às mesmas páginas.

Para contornar esse problema, eu vinha usando o plugin WP Super Cache, mais simples que o W3 Total Cache, mas com um recurso interessante que identifica a maioria dos bots e não gera página de cache a partir do acesso deles. Eles ainda são servidos por uma página de cache caso ela exista, mas não geram uma página de cache caso ela não exista. Com isso o Skooter Blog só gera páginas de cache a partir dos acessos de visitantes humanos, e apenas das páginas que os humanos estão realmente acessando, tornando o cache útil.

Recentemente eu descobri que nosso provedor de hospedagem, o Hawk Host, disponibilizou o PHP 7, o Memcache, e permite habilitar/desabilitar pacotes como APC e APCu. Há algumas semanas eu fiz essas migrações e outras mudanças que foram anunciadas aqui. Agora resolvi dar mais uma chance ao W3 Total Cache, pois suas maiores vantagens surgem quando recursos de cache em memória, como o APC, estão disponíveis. Sem isso, ele apenas faz cache em disco como o WP Super Cache.

O problema agora é que o W3 Total Cache parece ter sido abandonado por seu autor. A última atualização foi há 6 meses, e não há qualquer sinal de suporte ao PHP 7. Mas felizmente há alguns remendos simples que podem ser feitos a fim de que ele funcione com o PHP 7 e também com o novo APCu. Vamos a eles.

W3 Total Cache com PHP 7

Para que o W3 Total Cache funcione, uma única modificação é necessária. A dica é da Kimberly, nos fóruns do WordPress, a qual reproduzo aqui:

  1. Abra: /wp-content/plugins/w3-total-cache/lib/W3/Plugin/TotalCache.php
  2. Vá à linha 512
  3. Mude &$buffer para $buffer. Dessa forma você está removendo o e comercial (&).
  4. Salve (e faça upload da mudança para o website)

Essa pequena modificação imediatamente faz o W3 Total Cache funcionar com o PHP 7.

Mas ainda falta o APCu funcionar. Não encontrei nenhuma solução na web e acabei descobrindo uma por conta própria, o que motivou este artigo. Esta modificação é um pouco mais trabalhosa, mas vamos à ela.

W3 Total Cache com APCu

W3 Total Cache é compatível com o APC, mas no PHP 7 o módulo mudou de nome e se chama APCu. Com isso, todas as funções que iniciavam com ‘apc_’, agora iniciam com ‘apcu_’. Deduzi que, para que o plugin volte a funcionar, é preciso localizar os trechos onde essas funções são chamadas e fazer a alteração.

As chamadas do APC que o W3 Total Cache utiliza são três: apc_storeapc_fetch, e apc_delete. Elas devem ser trocadas para apcu_store, apcu_fetch, e apcu_delete, respectivamente.

Mas onde estão essas chamadas? Localizei-as em 4 arquivos:

  1. wp-content/plugins/w3-total-cache/inc/lightbox/self_test.php
  2. wp-content/plugins/w3-total-cache/lib/Minify/Minify/Cache/APC.php
  3. wp-content/plugins/w3-total-cache/lib/W3/Cache/Apc.php
  4. wp-content/plugins/w3-total-cache/lib/W3/UI/GeneralAdminView.php

O segredo então é abrir cada um desses quatro arquivos, localizar as chamadas  apc_storeapc_fetch, e apc_delete e substituí-las por apcu_storeapcu_fetch, e apcu_delete, respectivamente. Então é só salvar os arquivos e fazer o upload deles para o servidor. Com isso a opção para utilizar o APC fica disponível no W3 Total Cache (Opcode: Alternative PHP Cache (APC)) e é possível selecioná-la em vez do cache em disco.

Ainda estou testando, mas até o momento não encontrei nenhum efeito colateral nessas mudanças e aparentemente o cache com o APCu está funcionando corretamente.

APCu em funcionamento com o W3 Total Cache no Skooter Blog

APCu em funcionamento com o W3 Total Cache no Skooter Blog

APCu em funcionamento com o W3 Total Cache no Skooter Blog

APCu em funcionamento com o W3 Total Cache no Skooter Blog

Note que eu apenas contornei o problema para atender às minhas necessidades. Se você voltar ao PHP 5.x o APC não funcionará. O correto seria identificar APC e APCu separadamente, e usar as respectivas funções, mas essa tarefa eu prefiro deixar para o autor do plugin, caso ele um dia reapareça.

Atualização (04/03/2016): Havia me esquecido de mencionar no artigo que também há uma chamada para apc_delete que precisa ser substituída por apcu_delete. Obrigado, Jaakko, pelo comentário notando isso. Atualizei o artigo para incluir esta também esta chamada.

Sobre o autor

Skooter

Skooter é cientista da computação e fundador do Skooter Blog. Tem interesse em tudo relacionado a tecnologia e gosta de economizar fazendo suas compras diretamente do exterior.

Link permanente para este artigo: http://www.skooterblog.com/2016/02/23/w3-total-cache-com-php-7-e-apcu/

9 comentários

Pular para o formulário de comentário

  1. 1
    Jorge Mendonça

    O blog está carregando absurdamente mais rápido por aqui depois da mudança do layout!

    1. 1.1
      Skooter

      Obrigado pelo retorno.

  2. 2
    Polter

    Voce já consegue ter um bom lucro com o blog? Vejo que hoje o pessoal que produz conteudo semelhante ao seu (review de produtos, jogos antigos, etc) está todo optando por videos do youtube porque deve ser mais rentável, mas eu prefiro muito mais ler um review escrito no blog a video no youtube.

    1. 2.1
      Skooter

      Não consigo. São apenas 400~600 visitas por dia. Alguns artigos dão bastante trabalho, e poucos dão algum retorno, então financeiramente não vale a pena.
      Antigamente os programas de afiliados no exterior ainda rendiam bem e pagavam por alguns produtos. Mas depois que o Real começou a despencar acabou. Hoje pouca gente compra no exterior, não chega a 5% do volume de vendas de 2014, então mal dá para pagar os custos de hospedagem e domínio.
      É um nicho complicado, vi vários sites na mesma linha que duraram pouco tempo, inclusive um que contratou vários blogueiros famosos para fazer reviews, talvez para tentar agregar o público deles, mas em pouco tempo também sumiu.
      Eu também não gosto muito dessa migração em massa para o Youtube. Hoje em dia qualquer tutorial que poderia ser explicado com meia dúzia de linhas vira um vídeo de vários minutos no Youtube. Eu prefiro usar o Youtube só como complemento do texto.

  3. 3
    Rafael

    Isso aí, perfeito. Após atualizar meu site para PHP 7 vi a memória do meu servidor manter-se alta diariamente. Aí notei que o Minify não estava funcionado e provavelmente outros recursos do W3TC também não. Ao acertar o código citado acima na linha 512 espero que tudo volte ao normal, pelo menos o Minify eu já vi que passou a funcionar. Agora espero que o uso de memória diminua. Valeu!

  4. 4
    Carl

    I’m struggling to get this to work.

    1. 4.1
      Skooter

      Did you check if the APCu module is actually working on your server?

  5. 5
    Jaakko

    Hi, thank you for these instructions! Really saved my day. One note though. For me, it required changing also line 138 in Apc.php. There is “apc_delete”. I needed to change it too.

    1. 5.1
      Skooter

      Thank you. I also changed that one, but I forgot it when I was writing the article. I’ll update it now.

Deixar uma resposta