zendframework / zend-cache

BSD 3-Clause "New" or "Revised" License
69 stars 53 forks source link

memcached doesn't work with plugin phpSerialize #144

Closed ares333 closed 6 years ago

ares333 commented 6 years ago

centos 7 php 7.1 memcached 1.5.3

$mem = new Zend\Cache\Storage\Adapter\Memcached(
    [
        'servers' => [
            'localhost',
            11211
        ]
    ]);
$mem->addPlugin(
    Zend\Cache\StorageFactory::pluginFactory('serializer',
        [
            'serializer' => 'phpSerialize'
        ]));
$key = 'test';
if (! $mem->hasItem($key)) {
    $mem->addItem($key, 0);
}
$mem->incrementItem($key, 1);
print_r($mem->getItem($key));

Memcached server has been restarted and clean before running the code.Exception is as below:

Zend\Cache\Exception\RuntimeException: ERROR was returned by server in /srv/www/1crud.com/app/library/vendor/zendframework/zend-cache/src/Storage/Adapter/Memcached.php:645
Stack trace:
#0 /srv/www/1crud.com/app/library/vendor/zendframework/zend-cache/src/Storage/Adapter/Memcached.php(425): Zend\Cache\Storage\Adapter\Memcached->getExceptionByResultCode(11)
#1 /srv/www/1crud.com/app/library/vendor/zendframework/zend-cache/src/Storage/Adapter/AbstractAdapter.php(1010): Zend\Cache\Storage\Adapter\Memcached->internalCheckAndSetItem(NULL, 'test', 'i:1;')
#2 /srv/www/1crud.com/app/library/vendor/zendframework/zend-cache/src/Storage/Plugin/Serializer.php(138): Zend\Cache\Storage\Adapter\AbstractAdapter->checkAndSetItem(NULL, 'test', 1)
#3 /srv/www/1crud.com/app/library/vendor/zendframework/zend-eventmanager/src/EventManager.php(322): Zend\Cache\Storage\Plugin\Serializer->onIncrementItemPre(Object(Zend\Cache\Storage\Event))
#4 /srv/www/1crud.com/app/library/vendor/zendframework/zend-eventmanager/src/EventManager.php(171): Zend\EventManager\EventManager->triggerListeners(Object(Zend\Cache\Storage\Event))
#5 /srv/www/1crud.com/app/library/vendor/zendframework/zend-cache/src/Storage/Adapter/AbstractAdapter.php(207): Zend\EventManager\EventManager->triggerEvent(Object(Zend\Cache\Storage\Event))
#6 /srv/www/1crud.com/app/library/vendor/zendframework/zend-cache/src/Storage/Adapter/AbstractAdapter.php(1270): Zend\Cache\Storage\Adapter\AbstractAdapter->triggerPre('incrementItem', Object(ArrayObject))
#7 /srv/www/1crud.com/app/controllers/Test.php(25): Zend\Cache\Storage\Adapter\AbstractAdapter->incrementItem('test', 1)
#8 [internal function]: TestController->indexAction()
#9 /srv/www/1crud.com/public/index.php(7): Yaf\Application->run()
#10 {main}
marc-mabe commented 6 years ago

If you are using a serializer on zend-cache level the data (in your case an integer 1) gets serialized as string before reaching the memcached extension. This way memcached can’t identify the stringified value as integer.

For using increment/decrement functionality you need to use the memcached internal serializer functionality.

ares333 commented 6 years ago

@marc-mabe Thanks very much.