使用较新的PHP pecl / memcached扩展。调用Memcached :: setOption()之类的;
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
的成本在150到500毫秒之间 - 只是在调用setOption()时,因为我们没有使用持久连接,而是在每个请求上执行此操作,这很痛苦。
深入研究,将Memcached :: OPT_DISTRIBUTION设置为Memcached :: DISTRIBUTION_CONSISTENT最终调用libmemcached中的update_continuum(),这看起来相当密集,虽然我们只传递了15个memcached服务器的列表,所以有点令人惊讶地看到重建连续数据结构需要150到500毫秒。
是否可以设置此选项仅适用于持久连接,在初始连接时只调用一次?或者这是一个libmemcached错误?
使用较新的pecl / memcached扩展1.0.1和libmemcached 0.38
感谢。
答案 0 :(得分:2)
目前libmemcached 0.38相当陈旧。 pecl / memcached 1.0.1也是如此。你能尝试从github发布pecl / memcached 2.0.0b1吗?
答案 1 :(得分:0)
与pecl / memcached 2.2.0相同的问题(最新的PECL撰写时)。对我来说唯一的解决方案是从DISTRIBUTION_CONSISTENT切换到:
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcached->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
似乎工作正常:
var_dump($memcached->getServerByKey($key)['host']);
// string '192.168.56.1' (length=12) <== dead host
$memcached->set($key, $result, 3600);
var_dump($memcached->getServerByKey($key)['host']);
// string '127.0.0.1' (length=9) <== working host
var_dump($memcached->getLastErrorMessage());
// string 'SUCCESS' (length=7)