Limpar cache não limpa as tabelas de cache?

11

Não entendo completamente a ação Limpar cache. Eu apenas clico em limpar o cache Limpar todos os caches em: admin / config / development / performance, depois vou ao banco de dados para verificar todas as tabelas de cache _... e acho que nenhum deles está vazio.

Isso é normal?
Posso apenas truncar todas as tabelas de cache _...?

Na verdade, eu só preciso limpar o cache_form. Posso truncar esta tabela?

chefnelone
fonte

Respostas:

13

Posso apenas truncar todas as tabelas de cache _...?

Você não deve truncar a tabela "cache_form", pois ela contém os dados usados ​​pelo Drupal para validá-los; se você excluir essa tabela, o formulário que está sendo enviado atualmente pelo usuário será invalidado e os usuários precisarão enviar o formulário novamente.

Pode haver outras tabelas de cache que fazem com que um módulo aja de maneira estranha. Essa é a razão pela qual os módulos que estão usando tabelas de cache extras (cujo nome geralmente começa com "cache_") devem implementar hook_flush_cache () para retornar as tabelas de cache que podem ser limpas do Drupal e que são chamadas com o seguinte código, de drupal_flush_all_caches () .

  $core = array('cache', 'cache_path', 'cache_filter', 'cache_bootstrap', 'cache_page');
  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all('*', $table, TRUE);
  }

drupal_flush_all_caches()é a função chamada system_clear_cache_submit () , o manipulador do formulário de envio chamado quando você clica no botão "Limpar todos os caches", na página de configurações de desempenho.

Durante as tarefas cron, system_cron () limpa o cache usando o código a seguir.

  $core = array('cache', 'cache_path', 'cache_filter', 'cache_page', 'cache_form', 'cache_menu');
  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all(NULL, $table);
  }

Como o primeiro argumento de cache_clear_all () é NULL, o código executado em DrupalDatabaseCache :: clear () (Drupal 7) é a seguinte.

if (variable_get('cache_lifetime', 0)) {
  // We store the time in the current user's $user->cache variable which
  // will be saved into the sessions bin by _drupal_session_write(). We then
  // simulate that the cache was flushed for this user by not returning
  // cached data that was cached before the timestamp.
  $user->cache = REQUEST_TIME;

  $cache_flush = variable_get('cache_flush_' . $this->bin, 0);
  if ($cache_flush == 0) {
    // This is the first request to clear the cache, start a timer.
    variable_set('cache_flush_' . $this->bin, REQUEST_TIME);
  }
  elseif (REQUEST_TIME > ($cache_flush + variable_get('cache_lifetime', 0))) {
    // Clear the cache for everyone, cache_lifetime seconds have
    // passed since the first request to clear the cache.
    db_delete($this->bin)
        ->condition('expire', CACHE_PERMANENT, '<>')
        ->condition('expire', REQUEST_TIME, '<')
        ->execute();
    variable_set('cache_flush_' . $this->bin, 0);
  }
}

O código remove apenas as linhas, que não são marcadas como permanentes e expiraram, das tabelas retornadas hook_flush_caches()e de várias tabelas de cache usadas no Drupal, incluindo "cache_form". Não deve haver muitas linhas no "cache_form"; se isso acontecer, você pode reduzir o tempo decorrido entre duas execuções consecutivas das tarefas cron ou executar o seguinte código em um módulo customizado.

cache_clear_all(NULL, 'cache_form');

Uma alternativa é fazer com que o cache seja limpo manualmente, usando o módulo Devel e o link do menu que ele mostra.

captura de tela

kiamlaluno
fonte
meu problema é que a tabela cache_form tem um tamanho de 63Mb para um site em produção há APENAS 2 dias. Meu medo é que esta tabela estará crescendo sem controle ...
chefnelone
1
Se você configurou o cron, as entradas expiradas de todos os caches (incluindo cache_form) devem ser limpas toda vez que são executadas.
mpdonadio
1
@chefnelone Como Kiamlaluno explicou, se você tiver seu cron configurado corretamente, esta tabela deverá ser limpa periodicamente.
barista amador
2
@kiamlaluno, ler esta resposta é muito informativo e prático, uma referência rápida útil para espinhos relacionados ao cache. 1+
amateur barista
Como você disse, o cron está sendo executado e a tabela foi limpa. Obrigado.
chefnelone
6

Se você estiver limpando o cache por meio da interface do usuário, assim que a página for recarregada, o cache começará a ser preenchido novamente. Em outras palavras, o ato de atualizar essa página faz com que o Drupal comece a armazenar em cache as coisas novamente (especialmente cache_menu).

Você pode DELETE FROM cachenas várias mesas com segurança.

Também tenho certeza de que fazer isso drush cc alltambém resultará em tabelas de cache totalmente vazias.

mpdonadio
fonte
Obrigado, só para ter certeza, eu só preciso limpar o cache_form. Posso truncar esta tabela?
chefnelone
4
Se você ler o código para api.drupal.org/api/drupal/includes%21common.inc/function/… , verá que o cache_form não é limpo e por quê. Se você tem certeza de que está tudo bem, deve conseguir fazer isso. Ocorreram alguns erros históricos com cache_form que não expiram e crescem sem limite.
mpdonadio