2010-11-29 80 views
0

我对memcached感到失望。使用它远非易事。为什么memcache的php扩展(或memcached)如此不可靠?

一个例子:

$memcache = new Memcache; 
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect"); 

$memcache->set('id', $array, 120); 

我一个小时前设置此有关 - 这是仍然存在!手册上说可以使用“从当前时间开始的秒数”作为参数。那么为什么会忽略失效?

另一件让我感到困惑的事情是,有时候值不写。这一切都是随机的。 “argyleblanket”提到在php手册中遇到这些问题: http://www.php.net/manual/en/memcache.set.php#84032 我已经在我所有的replace()调用中实现了这种回退。我不明白为什么它不会在第一个电话上工作。为什么提供一个replace()函数,如果它在星号中,如果它替换了内容?

问题是为什么我会信任这样的软件来做任何重要的事情,并且有没有办法让它更可靠?

+1

这是一个多么可怕又滔滔不绝的问题。当您未能阅读您所使用的方法的签名时,简单地假设该软件不可靠。 – Evert 2012-09-11 14:38:00

回答

7

您使用的语法错误。第三个参数是压缩标志。

制作一个简单的界面,如下所示。它可以帮助你:

/* defines params */ 
define('MEMCACHED',  1); 
define('CACHE_DEFAULT_EXPIRE', 3600); 

if(MEMCACHED) if(! class_exists('memcached')) die('memcache not loaded'); 

/* Cache */ 
if(MEMCACHED) { 
    global $memcache; 
    $memcache = new Memcache(); 
    $memcache->connect('127.0.0.1', 11211); 
} 

function cacheSet($key, $var, $expire=NULL) { 
    if(!MEMCACHED) return 0; 
    global $memcache; 
    if(!$expire) $expire = CACHE_DEFAULT_EXPIRE; 
    $key = md5($key); 
    return $memcache->set($key, $var, false, $expire); 
} 

function cacheGet($key) { 
    if(!MEMCACHED) return 0; 
    global $memcache; 
    $key = md5($key); 
    return $memcache->get($key); 
} 
+0

谢谢。也许它显示了意想不到的结果,因为我没有使用正确的语法。 – user478419 2010-11-30 19:36:17

5

第三个参数是Memcache::set$标志,不$到期$到期是第四个:

$memcache = new Memcache; 
// add server, etc. 
$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry 
var_dump($memcache->get('foo')); // bar 
sleep(6); 
var_dump($memcache->get('foo')); // false 

你正在使用的语法为Memcached类,而不是Memcache

至于你的set/replace问题,我无法在PHP 5.3.3上使用Memcache或Memcached来重现此问题。

此外,在我看来,你应该去为PECL memcached扩展。它提供了更多的功能,并直接使用libmemcached,所以它也应该更高效。

+0

“第二个参数”也许你的意思是第三个参数? – Powerlord 2010-11-29 15:49:09

相关问题