memcached cache pool adapter

This commit is contained in:
Rob Frawley 2nd 2016-12-04 19:46:13 -05:00
parent d6e8937e69
commit 12de2aeb33
No known key found for this signature in database
GPG Key ID: 0EC41426CA2BA4E4
2 changed files with 130 additions and 0 deletions

View File

@ -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();
}
}

View File

@ -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());
}
}