mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
Implemented group read/write support for the ApcEngine
This commit is contained in:
parent
58a59fd4a4
commit
3c9c3ef9ba
4 changed files with 83 additions and 2 deletions
|
@ -91,6 +91,8 @@ class Cache {
|
|||
* The following keys are used in core cache engines:
|
||||
*
|
||||
* - `duration` Specify how long items in this cache configuration last.
|
||||
* - `groups` List of groups or 'tags' associated to every key stored in this config.
|
||||
* handy for deleting a complete group from cache.
|
||||
* - `prefix` Prefix appended to all entries. Good for when you need to share a keyspace
|
||||
* with either another cache config or another application.
|
||||
* - `probability` Probability of hitting a cache gc cleanup. Setting to 0 will disable
|
||||
|
|
|
@ -27,6 +27,14 @@ abstract class CacheEngine {
|
|||
*/
|
||||
public $settings = array();
|
||||
|
||||
/**
|
||||
* Contains the compiled string with all groups
|
||||
* prefixes to be prepeded to every key in this cache engine
|
||||
*
|
||||
* @var string
|
||||
**/
|
||||
protected $groupPrefix = null;
|
||||
|
||||
/**
|
||||
* Initialize the cache engine
|
||||
*
|
||||
|
@ -37,10 +45,14 @@ abstract class CacheEngine {
|
|||
*/
|
||||
public function init($settings = array()) {
|
||||
$this->settings = array_merge(
|
||||
array('prefix' => 'cake_', 'duration' => 3600, 'probability' => 100),
|
||||
array('prefix' => 'cake_', 'duration' => 3600, 'probability' => 100, 'groups' => array()),
|
||||
$this->settings,
|
||||
$settings
|
||||
);
|
||||
if (!empty($this->settings['groups'])) {
|
||||
sort($this->settings['groups']);
|
||||
$this->groupPrefix = str_repeat('%s_', count($this->settings['groups']));
|
||||
}
|
||||
if (!is_numeric($this->settings['duration'])) {
|
||||
$this->settings['duration'] = strtotime($this->settings['duration']) - time();
|
||||
}
|
||||
|
@ -108,6 +120,17 @@ abstract class CacheEngine {
|
|||
*/
|
||||
abstract public function clear($check);
|
||||
|
||||
/**
|
||||
* Does whatever initialization for each group is required
|
||||
* and returns the `group value` for each of them, this is
|
||||
* the token representing each group in the cache key
|
||||
*
|
||||
* @return array
|
||||
**/
|
||||
public function groups() {
|
||||
return $this->settings['groups'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache Engine settings
|
||||
*
|
||||
|
@ -127,8 +150,14 @@ abstract class CacheEngine {
|
|||
if (empty($key)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$prefix = '';
|
||||
if (!empty($this->groupPrefix)) {
|
||||
$prefix = vsprintf($this->groupPrefix, $this->groups());
|
||||
}
|
||||
|
||||
$key = Inflector::underscore(str_replace(array(DS, '/', '.'), '_', strval($key)));
|
||||
return $key;
|
||||
return $prefix . $key;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -127,4 +127,30 @@ class ApcEngine extends CacheEngine {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the `group value` for each of the configured groups
|
||||
* If the group initial value was not found, then it initializes
|
||||
* the group accordingly.
|
||||
*
|
||||
* @return array
|
||||
**/
|
||||
public function groups() {
|
||||
$groups = apc_fetch($this->settings['groups']);
|
||||
|
||||
if (count($groups) !== count($this->settings['groups'])) {
|
||||
foreach ($this->settings['groups'] as $group) {
|
||||
if (!isset($groups[$group])) {
|
||||
apc_store($group, 1);
|
||||
$groups[$group] = 1;
|
||||
}
|
||||
}
|
||||
ksort($groups);
|
||||
}
|
||||
|
||||
$result = array();
|
||||
foreach ($groups as $group => $value) {
|
||||
$result[] = $group . $value;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ class ApcEngineTest extends CakeTestCase {
|
|||
public function tearDown() {
|
||||
Configure::write('Cache.disable', $this->_cacheDisable);
|
||||
Cache::drop('apc');
|
||||
Cache::drop('apc_groups');
|
||||
Cache::config('default');
|
||||
}
|
||||
|
||||
|
@ -198,4 +199,27 @@ class ApcEngineTest extends CakeTestCase {
|
|||
$this->assertEquals('survive', apc_fetch('not_cake'));
|
||||
apc_delete('not_cake');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that configuring groups for stored keys return the correct values when read/written
|
||||
* Shows that altering the group value is equivalent to deleting all keys under the same
|
||||
* group
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testGroupsReadWrite() {
|
||||
Cache::config('apc_groups', array('engine' => 'Apc', 'duration' => 0, 'groups' => array('group_a', 'group_b')));
|
||||
$this->assertTrue(Cache::write('test_groups', 'value', 'apc_groups'));
|
||||
$this->assertEquals('value', Cache::read('test_groups', 'apc_groups'));
|
||||
|
||||
apc_inc('group_a');
|
||||
$this->assertFalse(Cache::read('test_groups', 'apc_groups'));
|
||||
$this->assertTrue(Cache::write('test_groups', 'value2', 'apc_groups'));
|
||||
$this->assertEquals('value2', Cache::read('test_groups', 'apc_groups'));
|
||||
|
||||
apc_inc('group_b');
|
||||
$this->assertFalse(Cache::read('test_groups', 'apc_groups'));
|
||||
$this->assertTrue(Cache::write('test_groups', 'value3', 'apc_groups'));
|
||||
$this->assertEquals('value3', Cache::read('test_groups', 'apc_groups'));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue