Utilizando Cache em suas Views para Melhorar o Desempenho de seus Módulos PrestaShop

Neste artigo falarei sobre um assunto de grande importância no desenvolvimento de módulos PrestaShop: a utilização de cache para melhorar a performance dos mesmos. A importância desse assunto é maior ainda quando falamos de módulos que são utilizados no Front-Office da loja, pois uma simples um módulo mal escrito pode comprometer seriamente o tempo de carregamento da loja. A boa notícia é que é bastante simples de se utilizar o cache interno do PrestaShop.

Como você já deve saber, todo o HTML da loja é (ou deveria ser) gerado através de alguma linguagem de template (smarty por padrão). Por se tratar de uma linguagem de template, ela deve ser compilada para a obtenção do HTML que será enviado ao navegador. Assim, se nenhum cache for utilizado, toda vez que uma página da loja for acessada, diversos arquivos de template devem ser compilados, mesmo que o resultado da compilação seja exatamente o mesmo que foi produzido na última vez que a loja foi acessada. Além de isso ser um desperdício de recursos do servidor, também faz com que o usuário espere mais tempo do que é necessário para que a página seja carregada. A situação é ainda pior quando o banco de dados precisa ser utilizado para obter os dados a serem utilizados no template.

Mas, conforme já foi dito, o sistema de cache do PrestaShop é bastante simples de ser utilizado, e você só precisará adicionar algumas poucas linhas de código ao seu módulo. Suponhamos que o seu módulo gere algum conteúdo a ser exibido no Front-Office da loja no hook displayShoppingCartFooter. Assim, o seu hook será algo como

Quando esta função for executada, se houver alguma versão do template ‘mytemplate.tpl’ em cache, o PrestaShop automaticamente utilizará essa versão, ao invés de recompilar o template. Se o nosso template não dependesse da variável $data, não precisaríamos fazer nada além disso para utilizar o sistema de cache do PrestaShop. Contudo, conforme o valor do carrinho de compras muda, o HTML produzido por esse template pode ser diferente. Isso faz com que precisemos de versões diferentes em cache desse mesmo template, que possam ser identificadas a partir do valor do carrinho de compras.

Isso pode ser feito utilizando o terceiro argumento do método Module::display(), denominado $cache_id, da seguinte forma:

Assim, o PrestaShop se encarregará de utilizar a versão em cache do template mytemplate.tpl associada ao cache $cache_id. Uma boa prática é utilizar o método Module::getCacheId(), que já gera uma string contendo as seguintes informações:

  • A loja foi acessada utilizando conexão segura ou não;
  • ID da loja acessada (no caso de multilojas);
  • ID do grupo de cliente a que o usuário que acessou a loja pertence;
  • Idioma utilizado pelo cliente no acesso à loja;
  • Moeda utilizada pelo cliente;
  • País selecionado pelo cliente.

Assim, um cache_id bastante interessante pode ser obtido como a seguir

Agora, observe que, caso o template esteja em cache e não precise ser recompilado, o objeto $data$ não será utilizado. Assim, podemos otimizar a nossa função verificando se há algum cache válido para o nosso template antes de chamar o método MyModel::getSomeDbData().

Por fim, a invalidação do cache pode ser feita através do método Module::_clearCache(). Caso desejemos limpar todos os caches associados ao nosso template sempre que sempre que qualquer objeto da classe MyModel for modificado, podemos utilizar o hook actionObjectMyModelUpdateAfter. Esse hook é invocado automaticamente pelo PrestaShop sempre que o método update() for executado com sucesso em um objeto da classe MyModel (que deve extender a classe ObjectModel do PrestaShop).

O método Module::_clearCache() também suporta o parâmetro $cache_id, para que possamos limpar o cache de apenas uma das versões do template.