Estou procurando uma resposta definitiva aqui. Quando o cache de objetos está ativado, onde opções e transitórios acabam sendo exibidos?
Por padrão, ambos são armazenados no banco de dados. Mas ouvi algumas referências de que o memcache as armazenará em outros lugares e a APC fará outra coisa completamente. Onde, exatamente , esses dados serão mantidos nos dois casos?
Respostas:
O WordPress, por padrão, faz uma forma de "Cache de Objeto", mas sua vida útil é apenas um carregamento de página única.
As opções são realmente um bom exemplo disso. Confira esta resposta para mais informações. O sumário:
SELECT option_name, option_value from $wpdb->options
declaração simplesget_option
nunca atingir o banco de dados porque elas são armazenadas com a API de cache do WP.As opções sempre "vivem" no banco de dados e sempre persistem lá - essa é a fonte "canônica". Dito isso, as opções são carregadas no cache do objeto; portanto, quando você solicita uma opção, há 99% de chance de a solicitação nunca atingir o banco de dados.
Os transientes são um pouco diferentes.
O WordPress permite que você substitua a API do cache por um drop-in - um arquivo que é colocado diretamente na sua
wp-content
pasta. Se você criar seu próprio cache ou usar um plug-in existente , poderá fazer com que o cache do objeto persista por mais tempo que um único carregamento de página. Quando você faz isso, transitório, mude um pouco.Vamos dar uma olhada na
set_transient
funçãowp-includes/option.php
.Humm
$_wp_using_ext_object_cache
? Se for verdade, o WordPress usa o cache de objetos em vez do banco de dados para armazenar transitórios. Então, como isso é definido? Hora de explorar como o WP configura sua própria API de cache.Você pode rastrear quase tudo para
wp-load.php
ouwp-settings.php
- os quais são cruciais para o processo de inicialização do WordPress. Em nosso cache, existem algumas linhas relevanteswp-settings.php
.Lembra daquela queda de cima? Vamos dar uma olhada
wp_start_object_cache
emwp-includes/load.php
.As linhas relevantes da função (aquelas que pertencem a
$_wp_using_ext_object_cache
isso alteram como os transientes são armazenados).se
object-cache.php
existir no diretório de conteúdo, ele será incluído e o WP assume que você está usando um cache externo persistente - ele é definido$_wp_using_ext_object_cache
como true.Se você estiver usando um cache de objeto externo, os transientes o usarão. O que levanta a questão de quando usar opções versus transientes.
Simples. Se você precisar que os dados persistam indefinidamente, use as opções. Eles são "armazenados em cache", mas suas fontes canônicas são o banco de dados e nunca desaparecem, a menos que um usuário solicite explicitamente.
Para dados que devem ser armazenados por um período de tempo definido, mas não precisam persistir além de um tempo de vida útil especificado. Internamente, o WP tentará usar um cache de objeto externo e persistente, caso contrário, os dados entrarão na tabela de opções e serão coletados como lixo através do psuedo-cron do WordPress quando expirarem.
Algumas outras preocupações / perguntas:
get_option
? Provavelmente. Eles incorrem na chamada para uma sobrecarga de função, mas provavelmente não atingirá o banco de dados. O carregamento do banco de dados geralmente é uma preocupação maior na escalabilidade de aplicativos da Web do que o trabalho que seu idioma preferido gera para gerar uma página.add_option
com o último argumento opcional, poisno
eles não são carregados automaticamente. Dito isto, depois de buscá-los uma vez, eles entram no cache e as chamadas subseqüentes não atingem o banco de dados.fonte
Existem 4 tipos de cache que eu conheço
Trivial - Está sempre ativado e entra em vigor antes de qualquer outro armazenamento em cache. Ele armazena os itens em cache em um array php, o que significa que consome memória da sua sessão de execução php e que o cache é esvaziado após o término da execução do php. ou seja, mesmo sem usar outro cache, se você chamar get_option ('opt') duas vezes seguidas, fará uma consulta ao banco de dados somente na primeira e na segunda vez em que o valor será retornado da memória.
Arquivo - valores em cache são armazenados em arquivos em algum lugar no diretório raiz. Acredito que ele provou não ser eficaz em termos de desempenho, a menos que você tenha um armazenamento de arquivos mapeado em disco ou memória muito rápido.
APC (ou outro cache baseado em acelerador php) - Os valores em cache são armazenados na memória da máquina host e fora da alocação de memória php. A maior armadilha em potencial é que não há escopo de dados e, se você executar dois sites, potencialmente cada um poderá acessar os dados em cache do outro ou substituí-los.
Memcache - é um cache baseado em rede. Você pode executar o serviço de armazenamento em cache em qualquer lugar da rede e provavelmente armazena valores na memória do host. Você provavelmente não precisa do memcache, a menos que tenha um balanceamento de carga em ação.
BTW, o cache de objetos está armazenando em cache muito mais do que opções, ele armazenará quase tudo que foi recuperado do banco de dados usando a API WP de alto nível.
fonte
As opções são sempre armazenadas no banco de dados, enquanto os transitórios podem ser armazenados apenas na memória compartilhada se o APC e um plug-in que implementa o cache do APC no WP estiverem instalados. Memcache também usa memória.
As opções também são armazenadas na memória e carregadas a partir daí quando possível (se não, uma consulta db é executada).
fonte
Ótima pergunta.
Eu acho que
WP_Object_Cache
ainda falta a parte de como o WordPress usa a classe, então vou acrescentar isso.Dos documentos:
Aqui está a
WP_Object_Cache
estrutura.Você usa o
stats()
método para mostrar estatísticas gerais sobre o objeto de cache global e o que há nele. Aqui está a saída:Foi o que obtive antes no início de um modelo como
single.php
.Observe a variável que nos interessa é:
global $wp_object_cache
.O privado que o membro
$cache
mantém os dados reais de armazenamento em cache.Desde que eu estava
single.php
quando imprimi o cache:Estou recebendo uma única postagem em cache.
O objeto seria o valor e a chave de armazenamento em cache seria
Aqui você pode conferir a
$cache_key
estrutura:fonte