2013-08-28 25 views
2

至于我自己看着办,这似乎是成立的Memcached并设置TTL和命名空间的方式,但他们在高速缓存中没有效果。密钥没有用命名空间作为前缀,并且过期是无限的。设定的TTL和命名空间Zend框架2使用Memcached的

$MemcachedOptions = new \Zend\Cache\Storage\Adapter\MemcachedOptions(); 
    $MemcachedResourceManager = new \Zend\Cache\Storage\Adapter\MemcachedResourceManager(1, new \Zend\Cache\Storage\Adapter\Memcached()); 
    $MemcachedResourceManager->addServer(1, array('localhost', 11211)); 
    $MemcachedOptions->setResourceManager($MemcachedResourceManager); 

    $MemcachedOptions->setNamespace('FooBar_'); 
    $MemcachedOptions->setTtl(10); 

    $cache = $MemcachedOptions->getResourceManager()->getResource(1); 
    $cache->set('foobar_key','I am in cache'); 

有没有人有任何提示,线索?任何帮助将非常感激。

回答

9

MemcachedResourceManager作品不同,你尝试使用它。

你应该像下面这样初始化:

// init a memcached resource manager with one native memcached resource 
// using resource id "1" 
$MemcachedResourceManager = new \Zend\Cache\Storage\Adapter\MemcachedResourceManager(); 
$MemcachedResourceManager->addServer('1', array('localhost', 11211)); 

// init a memcached storage adapter 
// using the native memcached resource of id "1" 
// configure it with a ttl and a namespace 
$cache = \Zend\Cache\StorageFactory::adapterFactory('memcached', array(
    'resource_manager' => $MemcachedResourceManager, 
    'resource_id'  => '1', 
    'namespace'  => 'FooBar_', 
    'ttl'    => 10, 
)); 

// or 
$memcachedAdapterOptions = new \Zend\Cache\Storage\Adapter\MemcachedOptions(array(
    'resource_manager' => $MemcachedResourceManager, 
    'resource_id'  => '1', 
    'namespace'  => 'FooBar_', 
    'ttl'    => 10, 
)); 
$cache = new \Zend\Cache\Storage\Adapter\Memcached($memcachedAdapterOptions); 

怎样的类一起工作:

最重要的类是Zend\Cache\Storage\Adapter\Memcached它是在上下文中使用的Memcached本地实例的包装Zend\Cache\StorageInterface

该存储适配器具有多个定义为Zend\Cache\Storage\Adapter\MemcachedOptions选项。

因为在ZF2缓存存储适配器设计用于处理一个类型的项目来存储您需要为不同类型项目的Zend\Cache\Storage\Adapter\Memcached不同的实例。但你不惯于使用服务器分布式缓存(本地Memcached类的不同实例)不同的连接 - 这是Zend\Cache\Storage\Adapter\MemcachedResourceManager来玩。

Zend\Cache\Storage\Adapter\MemcachedResourceManager处理的Memcached的本地实例将由Zend\Cache\Storage\Adapter\Memcached使用。

+0

好极了!这起作用(将namesapce更改为名称空间)。谢谢你的两种帮助我理解的方式。 – Roland

+0

试图让我的头“针对不同类型的项目的.. \ Memcached的不同实例”。在这种情况下什么是“项目”,为什么你想要另一个Memcached实例?上面的工厂将始终使用相同的实例(除非另有说明)否? – Roland

+0

'.. \ Memcached针对不同类型项目的不同实例':一种类型的项目可以是用户,另一种类型可以是产品。他们每个人都想配置不同的ttl /命名空间等。如果您在存储或阅读项目之前不想更改配置,则需要使用不同的实例。 PS:''Zend \ Cache \ StorageFactory''不共享实例 - 它会在每次调用时创建一个新实例。 –