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.