Explicação de update_post_ (meta / term) _cache

20

Eu estava lendo algumas melhores práticas do 10up e elas mencionam a configuração dessas duas sinalizações como falsas em um WP_Query (dependendo do que você está consultando):

  • 'update_post_meta_cache' => false : útil quando postar meta não será utilizado.
  • 'update_post_term_cache' => false : útil quando os termos de taxonomia não serão utilizados.

Eu estou assumindo que ele usa algo como update_post_caches() mas eu não estou nem mesmo 100% de certeza do que isso significa. Alguém poderia explicar o que esses dois sinais significam em WP_Query e como eles são úteis? Quanto mais informações melhor, como eu não sei muito sobre como o WordPress armazena coisas, mas uma resposta bem pensada sobre essas duas bandeiras também é aceitável.

    
por Howdy_McGee 27.01.2016 / 18:29

2 respostas

26

Cache de objetos em todos os lugares

O WordPress tenta reduzir ao máximo o número de consultas ao banco de dados.

Por exemplo, sempre que você obtiver um meta campo ou um campo de taxonomia, antes de consultar o banco de dados, o WordPress examinará se isso já foi consultado e armazenado em cache e retornará de lá em vez de consultar o banco de dados.

O "trabalho de cache" é feito através de WP_Object_Cache class e wp_cache_* functions (que são wrapper para esse métodos de classe.)

Onde o cache vive

Por padrão, o "cache" nada mais é do que uma variável global do PHP. Significa que está na memória, mas também significa que desaparece a cada pedido.

No entanto, por meio de dropins ( advanced-cache.php e / ou object-cache.php ), é possível configurar uma maneira personalizada de manipular esse cache.

Normalmente, esses dropins são usados para configurar algum tipo de mecanismo de cache que "sobreviva" a solicitações singulares.

Por esta razão, entre pessoas do WP, elas são conhecidas como plugins de "cache persistente" (mesmo se fora da bolha as palavras "cache" e "persistente" não fazem muito sentido juntas).

As escolhas populares hoje em dia são Memcached ou Redis .

Portanto, usando plugins "cache persistente" você pode reduzir drasticamente o número de consultas ao banco de dados, porque o cache não é atualizado em todas as solicitações.

Alguns exemplos

$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);

As duas linhas de código acima irão disparar, no máximo, uma consulta ao banco de dados.

Na verdade, quando você consulta um campo personalizado, todos os campos dessa postagem são recuperados do banco de dados, armazenados em cache por meio do cache de objetos e solicitações subsequentes extraem dados do cache e não do db.

O mesmo acontece para termos de taxonomia, o WordPress retira todos os termos de uma taxonomia uma vez e os retorna do cache.

O cache de objetos é usado amplamente no WordPress. Não só para posts, valores meta e taxonomias, mas também para usuários, comentários, dados de temas ...

O que o WP_Query tem a ver com tudo isso?

Quando você consulta algumas postagens via WP_Query , por padrão, o WordPress não apenas as extrai do banco de dados (ou do cache se elas são armazenadas em cache), mas também atualiza o cache para todos os campos personalizados e todas as taxonomias relacionado às postagens tiradas.

Portanto, quando você chama, por exemplo, get_the_terms() ou get_post_meta() enquanto as postagens em loop recebem WP_Query , na verdade você não aciona nenhuma consulta ao banco de dados, mas obtém informações do cache.

Bom, não é?

Bem, sim, mas isso tem um custo.

A atualização de cache "mágica" que o WordPress faz quando as postagens por meio de WP_Query acontecem em update_meta_cache para meta e em update_object_term_cache para taxonomias.

Se você olhar o código-fonte dessas funções, verá que o WordPress realiza apenas uma consulta em cada função, mas também faz muito processamento. Por exemplo, em update_object_term_cache 7 aninhados foreach ... se você tem muitas taxonomias e o número de postagens por página é alto, isso não é muito eficiente.

Sobre esses WP_Query argumentos, finalmente

O que 'update_post_meta_cache' e 'update_post_term_cache' fazem quando definido como false é impedir que o WordPress atualize o cache para campos e taxonomias personalizados, respectivamente.

Nesse caso, na primeira vez em que um campo personalizado ou uma taxonomia é consultada, uma consulta ao banco de dados é acionada e os dados são armazenados em cache.

Vale a pena?

Como de costume, a resposta é depende . Na maioria das vezes, definir esses valores como false é uma boa escolha, pois evita consultas desnecessárias de processamento e banco de dados, se não for necessário, e o cache é atualizado de qualquer maneira nos primeiros termos de campo / taxonomia personalizados.

No entanto, se você for chamar, mesmo uma vez, get_post_meta() durante o loop e chamará get_the_terms() para todas (ou a maioria) das taxonomias suportadas pelas postagens, a atualização do cache será acionada de qualquer maneira , e pode não haver benefício real em definir esses argumentos de consulta para false .

    
por gmazzap 27.01.2016 / 20:20
3

O principal ponto de interesse aqui é a função update_post_caches . É chamado após WP_Query ter todas as postagens do banco de dados. Normalmente, o motivo pelo qual você deseja as postagens é exibi-las, o que geralmente significa exibir os termos e algo com base nos metadados, portanto, WP_Query também consultará por padrão o DB para os dados meta e de termo relacionados aos posts retornados. e armazena o cache *. Essas informações não estão explicitamente disponíveis nos dados retornados de WP_Query, mas quando você chamar as APIs relevantes para obter o termo e a meta info de uma postagem específica, ela já estará disponível na memória e não haverá necessidade de enviar uma nova mensagem. consulta ao banco de dados.

Isso permite que o wordpress reduza a sobrecarga relacionada ao envio de solicitações ao banco de dados enviando apenas uma solicitação para obter as informações de todas as postagens, em vez de enviar uma solicitação para cada postagem.

Agora não consigo encontrar nenhum exemplo não trivial de quando você não quer que o cache seja atualizado, mas um trivial pode ser se você quiser apenas uma lista dos títulos de todas as postagens. Para isso você não precisa de termo ou metadados.

* cache - O mais importante aqui é o cache baseado em memória, no qual o WP armazena quase tudo o que obtém do banco de dados, mesmo sem ter nenhum plugin de cache de objetos ativo. Obviamente, quando você tiver cache de objetos, as informações também serão armazenadas lá.

    
por Mark Kaplun 27.01.2016 / 19:23