O que são APIs de transientes?

Publicados: 2020-12-16

O desempenho do site geralmente gira em torno da ideia de cache: armazenar dados em um estado pronto e de acesso mais rápido, para que sejam reproduzidos mais rapidamente pelos navegadores. A API WordPress Transients é uma ferramenta para armazenamento em cache e uma maneira poderosa de melhorar o desempenho de sites WordPress.

O que é cache e por que usá-lo?

Sempre que um navegador solicita uma página da web, o servidor servidor deve fazer muitos cálculos complexos e demorados, o que leva a atrasos. Depois de executar uma consulta, graças à tecnologia de cache, o servidor pode lembrar o resultado final e, em uma segunda solicitação, fornecê-lo ao navegador sem ter que fazer os mesmos cálculos novamente. Portanto, a capacidade de armazenar em cache e reutilizar recursos anteriores é crucial para otimizar o desempenho.

Muito simplesmente, o armazenamento em cache oferece a opção de armazenar informações temporariamente na camada de armazenamento em cache.

Quais são os tipos de cache?

Existem diferentes tipos de cache e, usando uma combinação deles, você alcançará um nível mais alto de desempenho.

tipos de cache

Cache do navegador

Antes de abrir o conteúdo de uma página da web, seu navegador precisa de um monte de coisas como arquivos JavaScript, folhas de estilo, fontes e assim por diante, todos baixados junto com o conteúdo da página.

Se um navegador armazenar esses arquivos em cache, não haverá necessidade de baixá-los cada vez que você carregar o site. Carregar o site pela primeira vez geralmente leva alguns segundos, mas depois que o navegador armazena esses arquivos em cache, o tempo de carregamento é reduzido significativamente.

Cache de servidor

Cache do servidor significa salvar o arquivo HTML para uma página específica e usá-lo para cada solicitação subsequente. Este é o chamado cache de página inteira.

Há outro tipo de cache de servidor - cache de objeto, que, ao contrário do cache de página inteira, armazena em cache apenas alguns bits (pedaços) de informação.

Cache de página

Considerado o cache mais eficaz. Seu nome é autoexplicativo para o modo como funciona. Quando o usuário 'A' visita uma página, o site a constrói e retorna o conteúdo ao navegador do usuário. Com o cache de página em execução, o conteúdo desta página é salvo para que, quando o usuário 'B' visitar a mesma página, o cache de página reproduza o conteúdo enviado anteriormente.

A maior vantagem do Cache de Página é que a página em cache retorna quase no momento do acesso. Como resultado, milhões de solicitações são processadas e páginas reproduzidas, mesmo no servidor mais fraco com a velocidade de memória mais baixa e pouco uso de CPU.

Mas esse tipo de cache também tem suas desvantagens: por exemplo, a incapacidade de armazenar páginas em cache para um usuário autorizado ou para um usuário cujo conteúdo da página depende das variáveis ​​do usuário atual.

Cache de banco de dados

O cache de banco de dados é um processo incluído no design de aplicativos de computador que geram páginas da web sob demanda (dinamicamente) acessando bancos de dados de back-end. Um cache de banco de dados aprimora seu banco de dados principal removendo pressão desnecessária sobre ele, normalmente na forma de dados lidos acessados ​​com frequência. O cache em si pode operar em várias áreas, incluindo seu banco de dados, aplicativo ou como uma camada independente.

Quando esses aplicativos são implantados em ambientes multicamadas que envolvem clientes baseados em navegador, servidores de aplicativos da web e bancos de dados de back-end, o cache de banco de dados de camada intermediária é usado para obter alta escalabilidade e desempenho.

Cache de objetos

O cache de objetos no WordPress (cache de objetos) envolve o armazenamento de consultas ao banco de dados. É um mecanismo de sistema integrado que permite salvar dados (objetos) de qualquer tipo e recuperá-los quando necessário. Esse cache é usado para armazenar os resultados de operações complexas.

Quando habilitado em seu site WordPress, ele ajuda a acelerar os tempos de execução do PHP, entregar conteúdo aos visitantes do site mais rapidamente e reduzir a carga no banco de dados.

CDN (redes de distribuição de conteúdo)

É uma infraestrutura de rede distribuída geograficamente que fornece entrega rápida de conteúdo aos usuários de serviços da web e sites. Os servidores incluídos no CDN estão geograficamente localizados de forma a tornar mínimo o tempo de resposta aos usuários do site / serviço.

O que é uma API de transientes no WordPress?

A API de transientes é a maneira de armazenar um bloco de informações (uma string de código, conteúdo HTML, objetos WP_Query, JSON) no banco de dados do site, em oposição ao cache do navegador. A API de transientes é muito semelhante à API de opções, mas a principal diferença é que a API de transientes tem um tempo de expiração, ou melhor, vida útil.

As três operações principais para transientes são definir valores, obter valores e excluir valores :

1. Defina um Transiente -

 set_transient ($ key, $ value, $ expires);

Para definir um transiente, você pode usar a função set_transient (), que tem três componentes:

  • Chave - nome exclusivo abreviado do transiente. Deve ter 172 caracteres ou menos.
  • Value - Qualquer tipo de variável PHP que contém as informações que serão armazenadas no banco de dados.
  • Tempo de expiração (vida útil) - A quantidade de tempo durante o qual as informações serão armazenadas.

Por exemplo, se quisermos salvar nossa consulta de postagens de listagem por um dia:

 set_transient ('unique_listing_posts_query_results_name',$ Listing_posts_query_results, DAY_IN_SECONDS);

Como você pode ver, usamos uma (DAY_IN_SECONDS) das várias constantes de tempo introduzidas no WordPress 3.5 para expressar o tempo facilmente. Aqui está uma lista completa de constantes de todos os tempos:

 MINUTE_IN_SECONDS = 60 (segundos)
HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS
MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS

2. Obtenha um Transiente -

 get_transient ($ key);

Para obter um transiente salvo, podemos usar

 get_transient ($ transient_name);

Em nosso caso, poderíamos buscar nossos resultados de consulta de listagem de posts com:

 get_transient ( 'unique_listing_posts_query_results_name' );

Veremos mais sobre isso mais tarde em nossa seção de exemplos.

3. Exclua um Transiente -

 delete_transient ($ key);

Conforme explicamos nas subseções anteriores, podemos usar a API de Transientes para obter e armazenar respostas remotas ou locais (conteúdo ou consulta de nosso banco de dados) em nosso banco de dados.

No entanto, aqui vem a questão de como excluímos o conteúdo armazenado antigo (temporário). Existem duas maneiras de limpar (excluir) transientes:

Exclusão automática

O legal sobre os transitórios é que eles expiram automaticamente se definirmos o tempo de expiração (vida útil) . Se você tentar recuperar um transiente de seu banco de dados após sua expiração, o WordPress o excluirá automaticamente, evitando qualquer confusão. O transiente será recriado assim que alguém abrir o site. Desta forma, estamos garantindo que temos novos conteúdos da API remota ou local.

Exclusão manual

Às vezes, precisaremos forçar o transiente a morrer mais cedo, excluindo-o manualmente. Isso é útil quando determinada atividade (adicionar novo item de menu, salvar ou atualizar uma postagem, adicionar ou atualizar uma categoria, etc.) tornará os dados armazenados em cache inerentemente obsoletos e precisam ser atualizados:

A função que devemos usar é

 delete_transient ($ transient_name)

e no nosso caso deveria ser:

 delete_transient ( 'unique_listing_posts_query_results_name' );

Nota: É importante NÃO usar transientes para armazenar dados valiosos que não podem ser recriados!

Por que devemos usar APIs de transientes?

Podemos usar a API de transientes sempre que tivermos um valor de computação intensiva que não muda com muita frequência e que você gostaria de armazenar em cache. No WordPress, isso geralmente vai ser o objeto resultante de uma consulta ao banco de dados, mas pode realmente ser qualquer coisa que você armazenaria em uma variável, seja um valor escalar, um array ou um objeto.

Portanto, em geral, os transientes são ótimos quando você está fazendo consultas complexas em seus temas e plug-ins.

Benefícios do Cache de Respostas Remotas ou Locais

Respostas de API remota

As APIs remotas sempre fazem várias chamadas ou solicitações para servidores remotos e há alguma latência extra. Isso leva tempo e causa atrasos. Além disso, algumas APIs remotas podem ter limites de taxa, o que significa que você pode atingir o limite máximo de solicitações em um determinado período.

E como você já sabe, podemos aproveitar as vantagens da API de Transientes para armazenar em cache a resposta (resultado) do servidor remoto e armazená-la em nosso banco de dados. Agora podemos usar o

 get_transient ();

e mostra o resultado / conteúdo armazenado (em cache) sempre que necessário, sem fazer outras chamadas ou solicitações remotas.

Tudo isso irá:

  • Reduza as chamadas e solicitações HTTPS remotas
  • Reduza o uso da CPU do servidor
  • Melhore o tempo de carregamento da página do site

Respostas API locais

- basicamente o HTML ou os resultados da consulta do banco de dados. Você pode usar a API de Transientes não apenas para armazenar em cache respostas remotas, mas também para armazenar conteúdo HTML ou resultados de consulta no banco de dados local. É muito útil se você deseja mostrar uma seção HTML repetível em seu site (widgets, controles deslizantes, menus, etc.) ou apenas para evitar que consultas complexas ou lentas de banco de dados sejam acionadas sempre que alguém visita seu site.

Onde e quando usar transitórios?

  • Consultas de banco de dados complexas e personalizadas
  • Menus de navegação do WordPress
  • Widgets da barra lateral que exibem informações como; tweets, uma lista de visitantes recentes do site ou uma lista de postagens de uma determinada categoria
  • Caching tag clouds
  • Cache de solicitações HTTP externas

Uso e exemplos

Depois de tantas explicações, é hora de exemplos reais.

Uso Básico

 function get_my_data () {

$ data = get_transient ('my_transient_name');
if (false === $ data) {// Transiente expirou / não foi definido

$ data = fetch_my_data (); // Extraia dados da fonte original

set_transient ('my_transient_name', $ data, HOUR_IN_SECONDS);

}

return $ data;

}

A função fetch_my_data () pode armazenar objeto WP_Query, dados json, conteúdo html , etc.

Exemplo Básico

Como já explicamos, esse tipo de cache é bom para salvar o resultado de operações longas, e o exemplo mais simples é acessar APIs externas, como o Facebook.

Imagine que temos a seguinte função, que acessa a API do Facebook, solicita um objeto (mais precisamente, uma página) seu-site.url e retorna o número de curtidas da página:

 function get_facebook_likes () {

$ result = wp_remote_get ('https://graph.facebook.com/your-website.url');

$ result = json_decode (wp_remote_retrieve_body ($ result));

return $ result-> likes;

}

echo "Gosta do Facebook:". get_facebook_likes ();

O tempo de execução desta função depende de muitos fatores, incluindo a localização do seu servidor em relação aos servidores do Facebook, o status e a velocidade da rede, etc. Em média, uma função pode levar de 1 a 3 segundos.

Isso significa que, ao usar esta função no site, o tempo de carregamento de cada página aumentará 1-3 segundos. Além disso, se chamarmos essa função mais de 500 vezes em 500 segundos, o Facebook começará a gerar um erro em vez de um resultado.

Para acelerar esse recurso, podemos usar a API WordPress Transients e salvar o resultado por 1 hora:

 function get_facebook_likes () {
if (false === ($ likes = get_transient ('fb_likes'))) {
$ result = wp_remote_get ('https://graph.facebook.com/your-website.url');
$ result = json_decode (wp_remote_retrieve_body ($ result));
$ likes = $ result-> likes;

// Definir transiente para uma hora em segundos
set_transient ('fb_likes', $ likes, 1 * HOUR_IN_SECONDS);
}

return $ likes;
}

Assim, quando esta função é chamada pela primeira vez, após receber uma solicitação do Facebook, o WordPress gravará o resultado no banco de dados e no futuro retornará esse resultado do banco de dados por uma hora sem fazer solicitações repetidas ao servidor do Facebook. E depois de uma hora, a função voltará novamente para o Facebook para dados.

Com essa abordagem, apenas uma chamada para essa função por hora aumentará o tempo da solicitação em 1-3 segundos e as chamadas subsequentes serão emitidas instantaneamente.

Exemplo Mais Complexo

Imagine que temos um site com cerca de 100 categorias e cerca de 50 000 posts, e no design de post único do site temos um widget que mostra os N posts relacionados da categoria em que o post atual se encontra. Como esperado, essa consulta complexa levará algum tempo para pegar o resultado do banco de dados e mostrá-lo no site.

Agora imagine que você tenha 10.000 usuários que acessam o site ao mesmo tempo. Isso significa que teremos mais de 10.000 solicitações de banco de dados que precisam fazer a consulta (esta é uma consulta complexa, pois pesquisaria em wp_terms, wp_term_relationships, wp_term_taxonomy, tabelas wp_posts , portanto, são mais de 10.000 consultas) para obter resultado para os N posts da categoria relacionada e mostrá-los no frontend. Isso, por sua vez, sobrecarregaria o banco de dados e atrasaria o tempo de carregamento geral do site e, em alguns casos, até travaria devido à sobrecarga do banco de dados.

E aí vem a questão de como podemos otimizar e reduzir o número de consultas e solicitações de banco de dados. Por que ter tantas consultas todas as vezes quando podemos aproveitar as vantagens da API de Transientes e apenas armazenar em cache o objeto de consulta ou armazenar em cache toda a saída HTML? Desta forma, reduziremos e otimizaremos o número de consultas ao banco de dados, o que levará a um melhor desempenho do site e uma melhor experiência do usuário.

Em nosso caso, as consultas irão pesquisar nas tabelas wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts para obter todos os resultados esperados.

Aqui está um exemplo completo de como podemos fazer isso:

 function show_posts_from_category () {
$ args = array (
'cat' => 555, // ID de categoria aleatória
'posts_per_page' => 8, // Número aleatório de postagens relacionadas para exibir
'No_found_rows' => true,
);

$ hash = md5 ($ args ['cat']); // hash MD5 do ID da categoria
$ transient_key = 'categoria-'. $ hash; // Chave Transiente

if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // O transiente expirou / não foi definido

$ the_query = novo WP_Query ($ args); // Obtenha a consulta

ob_start (); // Liga o buffer de saída

while ($ the_query-> have_posts ()): $ the_query-> the_post ();
?>
<div class = "item">
<div class = "bigthumb">
<a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php if (has_post_thumbnail ()) the_post_thumbnail ('big-thumb' ); ?> </a>
</div>
<h3> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php the_title (); ?> </a> </h3>
<? php the_excerpt (); ?>
</div>
<? php
fim;

$ post_from_category_html = ob_get_contents (); // Obtém o conteúdo do buffer de saída sem limpá-lo
ob_end_clean (); // Desativa este buffer de saída

set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Configurando o transiente com tempo de expiração de 15 minutos

wp_reset_postdata ();
fim se;

return $ post_from_category_html;
}

Pensamentos finais

O cache é uma ótima maneira de acelerar as coisas, mas você tem que saber exatamente o que está armazenando, onde pode fazer isso, quando e como, caso contrário, corre o risco de enfrentar consequências inesperadas.

Se você não tiver certeza se algo está funcionando conforme o planejado, sempre recorra à criação de perfil - observe cada consulta no banco de dados, observe todas as chamadas de função PHP, o tempo e o uso de memória.

Transients API é uma ótima maneira de otimizar o tempo de carregamento do seu site WordPress e fornecer uma experiência de usuário excepcional. Usar transientes em seus plug-ins e temas é simples e adiciona apenas algumas linhas extras de código. Quando usado nas situações certas - como longas consultas de banco de dados ou dados processados ​​complexos - pode economizar segundos no tempo de carregamento em seu site.