为什么memcache php扩展(或memcached)如此不可靠?

时间:2010-11-29 15:33:48

标签: php memcached

我对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()函数,如果它取代了内容,它是否在星空中?

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:5)

第三个参数Memcache::set $ flag ,而不是 $ expire $ expire 是第四个:

$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,因此它也应该更有效。