Posso semplicemente troncare tutte le tabelle cache _...?
Non devi troncare la tabella "cache_form", poiché contiene i dati utilizzati da Drupal per convalidarli; se si elimina quella tabella, il modulo attualmente inviato dall'utente verrà invalidato e gli utenti dovranno inviare nuovamente il modulo.
Potrebbero esserci alcune altre tabelle di cache che causano un'azione strana di un modulo. Questo è il motivo per cui i moduli che utilizzano tabelle di cache extra (il cui nome generalmente inizia con "cache_") dovrebbero implementare hook_flush_cache () per restituire le tabelle di cache che possono essere cancellate da Drupal e che viene quindi chiamato con il seguente codice, da 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()
è la funzione chiamata da system_clear_cache_submit () , il gestore del modulo di invio chiamato quando si fa clic sul pulsante "Cancella tutte le cache", nella pagina delle impostazioni delle prestazioni.
Durante le attività cron, system_cron () cancella la cache usando il seguente codice.
$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);
}
Come primo argomento di cache_clear_all () è NULL
il codice eseguito in DrupalDatabaseCache :: clear () (Drupal 7) è la seguente.
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);
}
}
Il codice rimuove solo le righe, che non sono contrassegnate come permanenti e scadute, dalle tabelle restituite hook_flush_caches()
e dalle varie tabelle cache utilizzate da Drupal, tra cui "cache_form". Non ci dovrebbero essere troppe righe in "cache_form"; in tal caso, è possibile ridurre il tempo trascorso tra due esecuzioni consecutive delle attività cron oppure eseguire il codice seguente da un modulo personalizzato.
cache_clear_all(NULL, 'cache_form');
Un'alternativa è quella di far cancellare manualmente la cache, usando il modulo Devel , e il collegamento al menu che mostra.