让 Zend Framework 2 Memcached 工作

Posted

技术标签:

【中文标题】让 Zend Framework 2 Memcached 工作【英文标题】:Getting Zend Framework 2 Memcached working 【发布时间】:2013-03-25 22:39:30 【问题描述】:

我正在尝试创建一个新的(已配置并可以使用)Zend\Cache\Storage\Adapter\Memcached 并收到错误:

文件:[项目]/vendor/zendframework/zendframework/library/Zend/Cache/Storage/Adapter/MemcachedResourceManager.php:52 消息:没有 ID 为“默认”的资源

Module

class Module implements ConfigProviderInterface, ServiceProviderInterface, AutoloaderProviderInterface 
    ...
    public function getServiceConfig() 
        try 
            return array (
                'factories' => array(
                    ...
                    'Cache\Adapter\Memcached' => function ($serviceManager) 
                        $memcached = new Memcached($serviceManager->get('Cache\Adapter\MemcachedOptions'));
                        return $memcached;
                    ,
                    'Cache\Adapter\MemcachedOptions' => function ($serviceManager) 
                        return new MemcachedOptions(array(
                            'ttl'           => 60 * 60 * 24 * 7, // 1 week
                            'namespace'     => 'cache_listener',
                            'key_pattern'   => null,
                            'readable'      => true,
                            'writable'      => true,
                            'servers'       => 'localhost',
                        ));
                    ,
                    'Search\Model\CityStorage' => function ($serviceManager) 
                        return new CityStorage(
                            $serviceManager->get('Search\Model\CityTable'),
                            $serviceManager->get('Cache\Adapter\Memcached')
                        );
                    
                )
            );
        
        ...
    
    ...

Controller

class SearchController extends AbstractActionController 
    ...
    public function searchCoursesAction() 
        ...
        return new ViewModel(array(
            ...
            'cities' => $this->getServiceLocator()->get('Search\Model\CityStorage')->getCities(),
        ));
    
    ...

Storage

<?php
namespace Search\Model;

use Zend\Cache\Storage\Adapter\AbstractAdapter;
use Search\Model\CityTable;

class CityStorage 

    /**
     * @var CityTable
     */
    private $cityTable;
    /**
     * @var AbstractAdapter
     */
    private $cacheAdapter;

    public function __construct(CityTable $cityTable, AbstractAdapter $cacheAdapter) 
        $this->cityTable    = $cityTable;
        $this->cacheAdapter = $cacheAdapter;
        $this->cacheCities();
    

    public function getCities() 
        if (!$this->cacheAdapter->hasItem('cities')) 
            $this->cacheCities();
        
        return $cacheAdapter->getItem('cities');
    

    private function cacheCities() 
        // $cities = $this->cityTable->fetchAll()->toArray();
        // $this->cacheAdapter->setItem('cities', $cities);
        $this->cacheAdapter->setItem('test', 123);
    


如何让它工作?

提前谢谢你!

编辑:

我已经使用设置servers 完成了MemcachedOptions(见上文)。现在可以了!

注意:servers 而不是server,因为Zend\Cache\Storage\Adapter\MemcachedOptions 类中没有方法setServer(),而只有setServers()

文件:/var/www/itt/unisportr-zf/vendor/zendframework/zendframework/library/Zend/Stdlib/AbstractOptions.php:85 消息:选项“服务器”没有必须定义的匹配 setServer 设置方法

【问题讨论】:

【参考方案1】:

正如您已经指出的,您必须定义一个资源 - 表示基本的 \Memcached 实例或自动实例化资源的选项之一。 (请查看Zend\Cache\Storage\Adapter\MemcachedResource) ... 这样做的原因是在不同的存储适配器实例上共享一个或多个 \Memcached 资源。

还请注意,AbstractAdapter 不是类型提示的标记 - 您应该通过 StorageInterface 输入提示;)

【讨论】:

以上是关于让 Zend Framework 2 Memcached 工作的主要内容,如果未能解决你的问题,请参考以下文章

带有 Zend Framework 2 模块的 PHPUnit

Zend Framework 2和PHP 7

有没有办法让文件上传输入匹配 Zend Framework 中的 dijit 主题?

如何让 Assetic 在 Windows 上的 Zend Framework 上编译 SCSS?

Zend Framework 2 Paginator Route 不起作用

使用Zend Framework创建cronjob