Méfiez-vous de memcache avec cache_form

Bon nombre de personnes voient memcache(d) comme un trou noir. Soit ils ne l'utilisent pas du tout, soit ils tentent de l'activer avec les réglages de base et ne le touchent plus du tout tant qu'il fonctionne "comme ça". Pourtant, certains réglages sont assez fins et nécessitent de s'y attarder pour des performances optimales.

Par exemple, je vois régulièrement le réglage suivant sous Drupal 7 :

$conf['cache_backends'][] = './sites/all/modules/memcache/memcache.inc';
$conf['cache_default_class'] = 'MemCacheDrupal';
$conf['memcache_bins'] = array(
  'cache' => 'default'
);
Alors oui, ça fonctionne effectivement bien qu'il soit possible d'optimiser ce snippet, mais ce n'est pas l'objet ici. Par contre, si vous lisez attentivement le README.txt qui vient avec le module, vous aurez peut-être remarqué une ligne importante :
Make sure the following line also exists, to ensure that the special
    cache_form bin is assigned to non-volatile storage:
      $conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
En effet, elle l'est. Toutes les tables cache_* ne sont pas forcément liées à du "cache" pur et dur. A vrai dire, cache_form n'en est même pas du tout. C'est simplement du stockage temporaire qui contiendra les éléments de formulaires multi-étapes via $form_state['storage'] ou #ahah.
 
Cela signifie donc qu'il n'est nullement possible d'assimiler cette table à du stockage volatile dont on pourra disposer à tout moment, surtout si vous voulez éviter le courroux légitime de vos utilisateurs qui remplissent quelque formulaire que ce soit sur votre site et découvriraient soudainement qu'ils ont tout perdu !

 

Tags:

Partager

Commentaires

Portrait de Etienne

Salut, merci pour cet article, c'est exactement ce que j'avais fait avant de décortiquer le fonctionnement de Drupal7 et Memcached, j'utilisais Memcache comme backend même pour les formulaires.
Parfois, les contributeurs perdaient leurs données saisies en backoffice, lors de la saisie de contenus... C'était à cause de ça. Depuis que j'ai basculé en base le cache des "form", tout est OK.
A+

Ajouter un commentaire