Comments (2)
Hey @darkalchemy
One of the things I really like about the Scrapbook architecture, is that you can just create another class that wraps over the rest, like how most of the features are currently implemented.
You could simply create another class that will relay all function calls to the actual storage, but (de)compresses first. Something like this (untested, might contain syntax errors):
class Compressor implements \MatthiasMullie\Scrapbook\KeyValueStore
{
/**
* @var KeyValueStore
*/
protected $cache;
/**
* @param KeyValueStore $cache
*/
public function __construct(KeyValueStore $cache)
{
$this->cache = $cache;
}
/**
* {@inheritdoc}
*/
public function get($key, &$token = null)
{
$value = $this->cache->get($key, $token);
return $this->decompress($value);
}
/**
* {@inheritdoc}
*/
public function getMulti(array $keys, array &$tokens = null)
{
$values = $this->cache->getMulti($keys, $tokens);
return array_map(function($value) {
return $this->decompress($value);
}, $values);
}
/**
* {@inheritdoc}
*/
public function set($key, $value, $expire = 0)
{
$value = $this->compress($value);
return $this->cache->set($key, $value, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function setMulti(array $items, $expire = 0)
{
$items = array_map(function($value) {
return $this->compress($value);
}, $items);
return $this->cache->setMulti($items, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function delete($key)
{
return $this->cache->delete($key);
}
/**
* {@inheritdoc}
*/
public function deleteMulti(array $keys)
{
return $this->cache->deleteMulti($keys);
}
/**
* {@inheritdoc}
*/
public function add($key, $value, $expire = 0)
{
$value = $this->compress($value);
return $this->cache->add($key, $value, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function replace($key, $value, $expire = 0)
{
$value = $this->compress($value);
return $this->cache->replace($key, $value, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function cas($token, $key, $value, $expire = 0)
{
$value = $this->compress($value);
return $this->cache->cas($token, $key, $value, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function increment($key, $offset = 1, $initial = 0, $expire = 0)
{
// @todo might have to go through uncompressed?
return $this->cache->increment($key, $offset, $initial, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function decrement($key, $offset = 1, $initial = 0, $expire = 0)
{
// @todo might have to go through uncompressed?
return $this->cache->decrement($key, $offset, $initial, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function touch($key, $expire)
{
return $this->cache->touch($key, $expire ?: $this->defaultExpire);
}
/**
* {@inheritdoc}
*/
public function flush()
{
return $this->cache->flush();
}
/**
* {@inheritdoc}
*/
public function getCollection($name)
{
return $this->cache->getCollection($name);
}
/**
* @param string $value
* @return string
*/
protected function compress($value)
{
// @todo gzencode expects string input
// might be ok for your use, or you might have to force $value to string,
// or implement a completely different compression
return gzencode($value, $level, FORCE_GZIP);
}
/**
* @param string $value
* @return string
*/
protected function decompress($value)
{
// @todo same note about strings
return gzdecode($value);
}
}
You would then use it like this:
// create \Memcached object pointing to your Memcached server
$client = new \Memcached();
$client->addServer('localhost', 11211);
// create Scrapbook cache object
$cache = new \MatthiasMullie\Scrapbook\Adapters\Memcached($client);
// add compression layer on top
$cache = new Compressor($cache);
from scrapbook.
Thanks!
from scrapbook.
Related Issues (20)
- tests cache/integration-tests dependency HOT 1
- Cache Statistics HOT 2
- Getting warning while get from APC
- Bottleneck in Couchbase Adapter HOT 1
- (Request) Setting a default TTL value HOT 1
- Trouble testing couchbase HOT 1
- Issue with Couchbase Adapter incompatibility (PHP 5.3)
- Stampede protection with "stale-while-revalidate" strategy? HOT 4
- PHP 7.4 error
- Documentation site returns 403 Forbidden HOT 1
- getClient HOT 1
- Redis wrong default value HOT 1
- Transaction savepoint HOT 1
- Stampede not working for phpredis > 4.0.0 HOT 2
- League Filesystem 2.0 HOT 1
- Update an existing value in cache causes the expire time (TTL) to be reset HOT 1
- undefined method: collection HOT 1
- Invalid key: test:string. Contains (a) character(s) reserved for future extension: HOT 4
- Support for psr/cache ^2.0 || ^3.0 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from scrapbook.