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

use*_*419 0 php memcached

我对memcached很失望.使用它并非易事.

一个例子:

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

$memcache->set('id', $array, 120);
Run Code Online (Sandbox Code Playgroud)

我在大约一个小时前设置了它 - 它仍然存在!手册说可以使用"从当前时间开始的秒数"作为参数.那么为什么忽略到期?

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

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

Fab*_*ora 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);
}
Run Code Online (Sandbox Code Playgroud)


net*_*der 5

第三个参数Memcache::set$标志,而不是$到期.$ 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
Run Code Online (Sandbox Code Playgroud)

您使用的语法是针对Memcached类,而不是Memcache.

至于你的set/replace问题,我无法用PHP 5.3.3上的Memcache或Memcached重现这个问题.

此外,在我看来,你应该去PECL memcached扩展.它libmemcached直接提供更多功能和用途,因此它也应该更有效.