2010-07-09 5 views
0

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.Memcache renvoie false sur les touches longues

Une idée de comment le faire fonctionner normalement (tronquer la clé à 250 caractères)?

Sinon - quel serait le moyen le plus simple de remplacer memcache dans tout mon code pour enregistrer les appels et savoir où je devrais 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 

Répondre

3

La taille maximale est en effet 250 (voir here).

Vous ne devriez pas tronquer les clés, car il peut mapper des clés qui étaient différentes de la même valeur (même chose pour md5, bien que cela soit très improbable). Si vous souhaitez détecter les cas où cela se produit et que vous utilisez l'interface OOP, vous pouvez décorer l'objet memcache en remplaçant set ou get (ou les deux) pour générer une exception ou une erreur lorsqu'il détecte une erreur. longue clé.

Avec héritage uniquement (pas de 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() 
//... 
+0

Tronquer à 250 devrait être OK puisque je connaissais La clé serait tronquée à 250 lorsque j'écrirais le code. Une idée de comment décorer l'objet memcache? J'ai peu d'expérience avec les méthodes dominantes en PHP. – Nir

2

Prenez votre clé à long et l'exécuter à travers md5() lorsque vous obtenez ou définissez. De cette façon, votre clé a toujours 32 caractères et vous ne devriez pas avoir à vous en préoccuper.

Quelque chose comme:

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

ensuite pour obtenir:

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

ou 'utiliser SHA1 (valeur $)', qui est toujours 40 caractères et a moins de chance de collision à cause de cela. – Powerlord

+0

Mieux encore, puisque c'est plus récent que PHP 5.1.2, 'hash ('sha256', $ value)' – Powerlord

+0

Merci, je suis conscient de cela, mais je suis intéressé par - soit le réglage de memcache pour travailler avec des touches plus longues (en ignorant le reste de la clé) ou en vérifiant si ce problème a une implication quelque part dans mon code de la manière la plus efficace, donc je serai en mesure d'ajouter du hachage là où il le faut – Nir

Questions connexes