Skip to content

Commit

Permalink
feature #20858 [Cache] Simple Memcached Adapter (robfrawley)
Browse files Browse the repository at this point in the history
This PR was merged into the 3.3-dev branch.

Discussion
----------

[Cache] Simple Memcached Adapter

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets |
| License       | MIT
| Doc PR        |
| Related PRs | #20863, ~~#20752~~

Commits
-------

12de2ae memcached cache pool adapter
  • Loading branch information
fabpot committed Dec 13, 2016
2 parents 38df506 + 12de2ae commit b79c716
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 0 deletions.
80 changes: 80 additions & 0 deletions src/Symfony/Component/Cache/Adapter/MemcachedAdapter.php
@@ -0,0 +1,80 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Cache\Adapter;

/**
* @author Rob Frawley 2nd <rmf@src.run>
*/
class MemcachedAdapter extends AbstractAdapter
{
private $client;

public static function isSupported()
{
return extension_loaded('memcached') && version_compare(phpversion('memcached'), '2.2.0', '>=');
}

public function __construct(\Memcached $client, $namespace = '', $defaultLifetime = 0)
{
parent::__construct($namespace, $defaultLifetime);
$this->client = $client;
}

/**
* {@inheritdoc}
*/
protected function doSave(array $values, $lifetime)
{
return $this->client->setMulti($values, $lifetime)
&& $this->client->getResultCode() === \Memcached::RES_SUCCESS;
}

/**
* {@inheritdoc}
*/
protected function doFetch(array $ids)
{
return $this->client->getMulti($ids);
}

/**
* {@inheritdoc}
*/
protected function doHave($id)
{
return $this->client->get($id) !== false
|| $this->client->getResultCode() === \Memcached::RES_SUCCESS;
}

/**
* {@inheritdoc}
*/
protected function doDelete(array $ids)
{
$toDelete = count($ids);
foreach ($this->client->deleteMulti($ids) as $result) {
if (\Memcached::RES_SUCCESS === $result || \Memcached::RES_NOTFOUND === $result) {
--$toDelete;
}
}

return 0 === $toDelete;
}

/**
* {@inheritdoc}
*/
protected function doClear($namespace)
{
return $this->client->flush();
}
}
50 changes: 50 additions & 0 deletions src/Symfony/Component/Cache/Tests/Adapter/MemcachedAdapterTest.php
@@ -0,0 +1,50 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Cache\Tests\Adapter;

use Symfony\Component\Cache\Adapter\MemcachedAdapter;

class MemcachedAdapterTest extends AdapterTestCase
{
protected $skippedTests = array(
'testExpiration' => 'Testing expiration slows down the test suite',
'testHasItemReturnsFalseWhenDeferredItemIsExpired' => 'Testing expiration slows down the test suite',
'testDefaultLifeTime' => 'Testing expiration slows down the test suite',
);

private static $client;

public static function setupBeforeClass()
{
if (!MemcachedAdapter::isSupported()) {
self::markTestSkipped('Extension memcached >=2.2.0 required.');
}

self::$client = new \Memcached();
self::$client->addServers(array(array(
getenv('MEMCACHED_HOST') ?: '127.0.0.1',
getenv('MEMCACHED_PORT') ?: 11211,
)));

parent::setupBeforeClass();
}

public function createCachePool($defaultLifetime = 0)
{
return new MemcachedAdapter(self::$client, str_replace('\\', '.', __CLASS__), $defaultLifetime);
}

public function testIsSupported()
{
$this->assertTrue(MemcachedAdapter::isSupported());
}
}

0 comments on commit b79c716

Please sign in to comment.