0 votes

Memcache renvoie false sur les clés longues

J'utilise Php memcache sur PHP Version 5.2.4-2ubuntu5.10 Ci-dessous vous pouvez trouver l'info de phpinfo.

Lorsque j'utilise une clé de plus de 250 caractères, memcache renvoie true sur $memcache->set et false sur $memcache->get .

Avez-vous une idée de la façon de le faire fonctionner normalement (en tronquant la clé à 250 caractères) ?

Si ce n'est pas le cas, quel serait le moyen le plus simple de remplacer memcache dans tout mon code pour enregistrer les appels et savoir où je dois changer la clé ? Merci

memcache support    enabled
Active persistent connections   0
Revision    $Revision: 1.86 $

Directive   Local Value Master Value
memcache.allow\_failover 1   1
memcache.chunk\_size 8192    8192
memcache.default\_port   11211   11211
memcache.hash\_function  crc32   crc32
memcache.hash\_strategy  standard    standard
memcache.max\_failover\_attempts  20  20

2voto

Cfreak Points 10831

Prenez votre clé longue et passez-la dans md5() lorsque vous l'obtenez ou la définissez. De cette façon, votre clé fait toujours 32 caractères et vous ne devriez pas avoir à vous en soucier.

Quelque chose comme :

$memcache->set(md5('really long key'), $value);

Alors pour obtenir :

$memcache->get(md5('really long key'));

2voto

Artefacto Points 50896

La taille maximale est en effet de 250 (voir ici ).

Il ne faut pas tronquer les clés, car cela peut faire correspondre des clés différentes à la même valeur (idem pour md5, bien qu'il soit très peu probable que cela se produise par accident).

Si vous voulez détecter les cas où cela se produit et puisque vous utilisez l'interface OOP, vous pouvez décorer l'objet memcache, en surchargeant set ou get (ou les deux) pour lancer une exception ou une erreur lorsqu'il trouve une clé longue.

Avec seulement l'héritage (sans décoration), vous pouvez faire

class MemcacheEx extends Memcache {
    public function set($key, $var, int $flag=0, $expire=0) {
        //do something with $key
        parent::set($key, $var, $flag, $expire);
    }

    //... similar for get
}
$memcache = new MemcacheEx(); //instead of new Memcache()
//...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X