Módulo 6 · 6.4
Velocidade e cache numa loja online
Módulo 6: Gestão e segurança · Tempo de leitura: 10 minutos
Objetivo de aprendizagem: Depois desta lição, saberá configurar a cache de uma loja WooCommerce de forma a que a loja seja rápida e as páginas pessoais nunca entrem na cache, e saberá verificá-lo através dos cabeçalhos HTTP.
Conceitos-chave: cache de páginas, exclusões (carrinho, finalização da compra, A minha conta), cookies que contornam a cache, cabeçalhos no-cache, DONOTCACHEPAGE, cache de objetos, Redis, fragmentos do carrinho, geolocalização com cache de páginas, limpeza das ações agendadas
Dois tipos de páginas
Os fundamentos da cache (cache de páginas, cache do navegador, cache de objetos, OPcache, uma CDN) estão no curso de WordPress, lição 6.2. Aí já se encontra também a regra mais importante para lojas: as páginas pessoais não podem entrar na cache de páginas. Esta lição desenvolve esse ponto.
Uma loja tem dois tipos de páginas:
| Tipo | Exemplos | Cache |
|---|---|---|
| Iguais para todos | página inicial, página da loja, categorias, páginas de produto, páginas informativas | Cache de páginas: sim, é aqui que está o maior ganho |
| Diferentes para cada visitante | carrinho, finalização da compra, A minha conta, a página de livre resolução com um cliente com sessão iniciada | Cache de páginas: nunca |
Se algo correr mal, nota-se de imediato: um cliente vê o carrinho de outra pessoa ou, pior, a morada de alguém na página de finalização da compra. Isso constitui também uma violação de dados pessoais na aceção do RGPD (KB 6749).
O que o WooCommerce já faz
O WooCommerce ajuda a cache de três formas, e convém conhecê-las para perceber quando algo as elimina:
- Constantes. No carrinho, na finalização da compra e em A minha conta, o WooCommerce define
DONOTCACHEPAGE(e também as constantes para a cache de objetos e de base de dados). Muitos plugins de cache leem essa constante e ignoram então a página. - Cabeçalhos HTTP. Nessas mesmas páginas, o WooCommerce envia os cabeçalhos no-cache do WordPress:
Cache-Control: no-cache, must-revalidate, max-age=0, privatee umExpiresno passado. Um proxy ou uma CDN que respeite as regras não guarda então a página. Para utilizadores com sessão iniciada, acresceno-store. - Cookies. Assim que alguém coloca algo no carrinho, o WooCommerce define cookies como
woocommerce_items_in_cart,woocommerce_cart_hashewp_woocommerce_session_.... Uma boa cache deixa de servir páginas guardadas aos visitantes com um desses cookies, mesmo nas páginas de produto, porque, por exemplo, o cesto no cabeçalho do site passa a ser diferente para cada visitante.
A documentação do WooCommerce indica para os plugins de cache: exclua o carrinho, A minha conta e a finalização da compra, bem como os cookies woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed e store_notice[...]. Para o Varnish, apresenta também regras para endereços com ?add-to-cart=.
Onde corre mal na prática
- Outros endereços para as páginas da loja. Mudou o nome do carrinho para
/mandje/ou um plugin de tradução cria/de/warenkorb/. Uma cache que exclui endereços fixos como/cartnão os apanha. Os plugins de cache que conhecem o WooCommerce leem as páginas a partir das configurações; uma cache no servidor ou numa CDN não o faz. - Uma CDN que guarda tudo em cache. Algumas regras de CDN («cache everything») ignoram os cabeçalhos HTTP. Nesse caso, exclua explicitamente as páginas da loja e os cookies indicados.
- Um plugin que substitui os cabeçalhos. Um plugin de segurança ou de velocidade define por vezes
Cache-Control: public, max-age=...em todas as páginas. Os cabeçalhos no-cache deixam então de estar presentes. - Uma sessão para cada visitante. Normalmente, o WooCommerce só define um cookie de sessão quando há algo no carrinho. Se um plugin ou tema iniciar uma sessão logo para cada visitante (um cookie
wp_woocommerce_session_ouPHPSESSIDna primeira visita), a cache de páginas deixa de funcionar para todos e a sua loja fica lenta em períodos de grande afluência. - Geolocalização. Em WooCommerce > Configurações > Geral escolhe a localização predefinida de um cliente. Com a opção simples «Geo-localizar», o servidor calcula o país para cada visitante, o que, com preços por país, não é compatível com uma cache de páginas. Por isso, o WooCommerce tem a opção «Geo-localizar (com suporte para cache de páginas)», que determina o país através de um pedido adicional no navegador. Se não precisar de preços ou IVA por país antes da finalização da compra, escolha o país da loja: é a opção mais simples. Para a geolocalização, o WooCommerce descarrega periodicamente uma base de dados da MaxMind.
Num servidor LiteSpeed (como na WebOké), o plugin LiteSpeed Cache trata ele próprio das exclusões para o WooCommerce; verifique-as nas configurações de exclusão. Noutros servidores web e fornecedores de alojamento, o processo é semelhante com outro plugin de cache.
O que a cache de páginas não resolve
O carrinho e a finalização da compra são sempre gerados pelo PHP e pela base de dados. Em períodos de grande afluência (uma promoção, uma newsletter), são precisamente as páginas onde os seus clientes gastam dinheiro. Aí ajudam outras coisas:
- Uma cache de objetos como o Redis guarda em memória o resultado das consultas à base de dados. Numa loja, com muitas páginas que não podem entrar na cache de páginas, isso traz um ganho bem maior do que num site comum. O seu alojamento tem de disponibilizar o Redis (na WebOké é possível, DA 15.7); depois ativa-o com um plugin.
- Fragmentos do carrinho. Os temas clássicos atualizam o cesto no cabeçalho do site com um script (
wc-cart-fragments) que faz um pedido adicional quando o carrinho tem produtos. Os temas de blocos modernos, com o bloco de mini-carrinho, precisam menos disso. Não carregue esses scripts em páginas onde não fazem nada. - Ações agendadas limpas. O WooCommerce usa o Action Scheduler para tarefas em segundo plano (lição 7.3). As ações concluídas são, por predefinição, eliminadas ao fim de um mês. Se mesmo assim a lista chegar às centenas de milhares, muitas vezes devido a uma extensão que continua a agendar algo ou a ações falhadas, as consultas à base de dados ficam mais lentas. Consulte em WooCommerce > Estado > Acções agendadas o número de ações falhadas e pendentes.
- HPOS. As encomendas em tabelas próprias (lição 1.2) tornam a pesquisa de encomendas mais rápida do que na antiga tabela de artigos. As lojas existentes têm de fazer a mudança por si (lição 6.2 sobre cópias de segurança prévias).
- Uma versão atual do PHP e memória suficiente (lição 7.2).
Na prática: é assim que fica no WooCommerce
Verifique-o na Theehuis Example numa janela privada com as ferramentas de programador do seu navegador (F12, separador Rede, primeiro pedido):
- Página inicial, carregada duas vezes: na segunda vez, um cabeçalho como
x-litespeed-cache: hitoucf-cache-status: HIT. Nenhum cookiewp_woocommerce_session_na primeira visita. shop.example.com/winkelwagen/, carregada duas vezes: nenhum hit, ecache-controlcomno-cacheouprivate.- O mesmo para a finalização da compra e A minha conta.
- Coloque um produto no carrinho e carregue uma página de produto: vê o seu próprio cesto, não uma versão guardada.
Resumo
- As páginas iguais para todos vão para a cache; o carrinho, a finalização da compra e A minha conta nunca.
- O WooCommerce define ele próprio DONOTCACHEPAGE, cabeçalhos no-cache e cookies; verifique que nada os elimina ou ignora.
- Tenha atenção a endereços com outro nome, regras de CDN, plugins que substituem cabeçalhos, sessões para cada visitante e geolocalização.
- O Redis, as ações agendadas limpas, o HPOS e uma boa versão do PHP ajudam onde a cache de páginas não pode atuar.
- Teste carregando duas vezes numa janela privada e leia os cabeçalhos HTTP.
Questionário
Exercício
Exercício A6.4: O carrinho e a finalização da compra ficam fora da cache? Introduza o endereço da sua loja e os endereços do carrinho e da página de finalização da compra (e, se quiser, de A minha conta). O programa pede a página inicial duas vezes, com 2 segundos de intervalo, sem cookies, e depois pede também cada página da loja duas vezes. Nada é colocado no carrinho e nada é encomendado. Verde se a página inicial vier da cache na segunda vez (ou for claramente mais rápida) sem definir um cookie de sessão, e se cada página da loja, na segunda vez, não tiver um acerto de cache e enviar um Cache-Control com no-cache, no-store, private ou max-age=0. Laranja se a página inicial não usar cache, ou se uma página da loja não tiver acerto de cache mas também não enviar um cabeçalho no-cache. Vermelho se houver um acerto de cache no carrinho, na finalização da compra ou em A minha conta, ou se a página inicial iniciar uma sessão WooCommerce para cada visitante.
Um visto verde significa que esta verificação está correta neste momento, não que a sua loja é segura.
Para saber mais
Os passos num painel aplicam-se à WebOké; noutros fornecedores, o processo é semelhante.
- Curso gratuito de WordPress 6.2: Caching
- Curso gratuito de WordPress 6.3: Imagens, PHP e outros ganhos de velocidade
- Manual DirectAdmin 15.7: Redis
- O meu website está lento ou utiliza demasiado CPU: saiba como o tornar mais rápido
- Trata-se de uma violação de dados e tenho de a comunicar?
- Configuring caching plugins (developer.woocommerce.com, em inglês): https://developer.woocommerce.com/docs/best-practices/performance/configuring-caching-plugins/
- LiteSpeed Cache para WordPress e uma loja online
