Cancella cache non cancella le tabelle della cache?


11

Non capisco completamente l'azione Cancella cache. Faccio semplicemente clic su Svuota cache Cancella tutte le cache in: admin / config / development / performance, quindi vado nel database per controllare tutte le tabelle della cache _... e trovo che nessuna di esse sia vuota.

È normale?
Posso semplicemente troncare tutte le tabelle cache _...?

In realtà ho solo bisogno di cancellare cache_form. Posso troncare questa tabella?

Risposte:


13

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 () è NULLil 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.

immagine dello schermo


il mio problema è che la tabella cache_form ha una dimensione di 63 Mb per un sito Web che è stato in produzione per soli 2 giorni. La mia paura è che questo tavolo cresca senza controllo ...
chefnelone

1
Se hai impostato cron, le voci scadute da tutte le cache (incluso cache_form) devono essere cancellate ogni volta che vengono eseguite.
mpdonadio

1
@chefnelone Come spiegato da kiamlaluno, se hai il cron impostato correttamente, questa tabella dovrebbe essere cancellata periodicamente.
barista dilettante

2
@kiamlaluno, leggere questa risposta è molto istruttivo e pratico, un utile riferimento rapido per le spine relative alla cache. 1+
barista dilettante

Come hai detto ho cron in esecuzione e la tabella è stata cancellata. Grazie.
Chefnelone,

6

Se si cancella la cache tramite l'interfaccia utente, non appena la pagina viene ricaricata, la cache inizierà a riempirsi di nuovo. In altre parole, l'atto di aggiornare quella pagina fa sì che Drupal inizi a ricominciare a memorizzare le cose (in particolare cache_menu).

Puoi DELETE FROM cachesui vari tavoli in sicurezza.

Sono anche abbastanza sicuro che fare un drush cc allcomporterà anche tabelle di cache completamente vuote.


Grazie, solo per essere sicuro di aver bisogno di cancellare cache_form. Posso troncare questa tabella?
Chefnelone

4
Se leggi il codice per api.drupal.org/api/drupal/includes%21common.inc/function/… , vedrai che cache_form non viene cancellato e perché. Se sei sicuro che sia OK, allora dovresti essere in grado di farlo. Ci sono stati alcuni bug storici con cache_form che non scadevano voci e che crescevano senza limiti.
mpdonadio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.