2

I am trying to get memcache to work with Zendframework 2. How do I get Zendframework 2 to see memcache correct so I don't get the error I have listed below? I want to use memcache instead of memcached.

Error:

Exception - An abstract factory could not create an instance of memcache(alias: memcache).

Previous exceptions - An exception was raised while creating "memcache"; no instance returned

The option "liboptions" does not have a matching setLiboptions setter method which must be defined

I get this error when just trying to test it with this line in a controller

echo $this->getServiceLocator()->get('memcache')->getVersion();

Details:

I'm running windows 7 64 bit with a local instance of IIS7 up and running.

I used this guide to install memecache on my pc: How to Install Memcache on Windows 7

I verified the memcache service is up and running I verified that using memecache outside of Zendframework 2 works.

So next I followed this guide to get it to work in Zendframework 2: How to setup Zendframework 2 to use Memcached I know this guide is for memcached and not memcache but I used it as a base

Troubleshooting I've done already:

  1. Verified service is running
  2. Verified phpinfo() shows the memcache section so I know the php extension is loading from the php.ini
  3. Since I'm still hazy on memcache vs memcached I've tried setting the config files and above echo to try and use the string 'memcached' and 'memcache' to see if that would help find it, but didn't work.
  4. I read some things online about how a 'Di' thing can conflict with this. I verified my config does not load anything with 'Di'
  5. Verified that the abstract factory setting is loaded in the config under Service Manager

Code:

config var_dump showing the abstract factory part is loading

$sm = $this->getServiceLocator();
$config = $sm->get('config');
var_dump($config);die();

'service_manager' => 
array (size=3)
  'abstract_factories' => 
    array (size=2)
      0 => string 'Zend\Cache\Service\StorageCacheAbstractServiceFactory' (length=53)
      1 => string 'Zend\Log\LoggerAbstractServiceFactory' (length=37)
  'aliases' => 
    array (size=2)
      'translator' => string 'MvcTranslator' (length=13)
      'db' => string 'Zend\Db\Adapter\Adapter' (length=23)
  'factories' => 
    array (size=1)
      'Zend\Db\Adapter\Adapter' => string 'Zend\Db\Adapter\AdapterServiceFactory' (length=37)

My cache.local.php and it's in the autoload directory of zendframework 2 (taken from above tutorial link and removed the 'd') I think this is what I need to change just not sure how....

return array(
'caches' => array(
    'memcache' => array( //can be called directly via SM in the name of 'memcache'
        'adapter' => array(
            'name'     =>'memcache',
            'lifetime' => 86400,    //24 hours
            'options'  => array(
                'servers'   => array(
                    array(
                        '127.0.0.1',11211   //Server IP, Port
                    )
                ),
                'namespace'  => 'MYMEMCACHENAMESPACE',
                'liboptions' => array (
                    'COMPRESSION' => true,
                    'binary_protocol' => true,
                    'no_block' => true,
                    'connect_timeout' => 120
                )
            )
        ),
        'plugins' => array(
            'exception_handler' => array(
                'throw_exceptions' => false
            ),
        ),
    ),
),

);

HotRod
  • 123
  • 2
  • 13

1 Answers1

3

You need to install the PHP library memcached so you can use ZFs Memcached Adaptor. ZF does not have an adaptor for the memcache library so it's trying to use the library directly which does not have a setter for liboptions. Either install memcached or remove liboptions in your config and you should be all set.

Squeegy
  • 869
  • 9
  • 20
  • 1
    I ended up removing the liboptions from the config to get this to work. Thank you! Also I had to remove lifetime key, instead I added a 'ttl' key to the options array to set the amount of time to hold onto the cache – HotRod Oct 15 '15 at 18:47