Skip to content

Commit 17e035e

Browse files
committed
Cache: added events WIP
1 parent 0e498d7 commit 17e035e

File tree

4 files changed

+59
-7
lines changed

4 files changed

+59
-7
lines changed

src/Caching/Cache.php

+22-7
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,18 @@ class Cache
3333
NAMESPACES = 'namespaces',
3434
ALL = 'all';
3535

36+
public const
37+
EVENT_HIT = 'hit',
38+
EVENT_MISS = 'miss',
39+
EVENT_SAVE = 'save',
40+
EVENT_REMOVE = 'remove';
41+
3642
/** @internal */
3743
public const NAMESPACE_SEPARATOR = "\x00";
3844

45+
/** @var array */
46+
public $onEvent;
47+
3948
/** @var Storage */
4049
private $storage;
4150

@@ -87,8 +96,9 @@ public function load($key, callable $generator = null)
8796
{
8897
$storageKey = $this->generateKey($key);
8998
$data = $this->storage->read($storageKey);
99+
$this->onEvent($this, $data === null ? self::EVENT_MISS : self::EVENT_HIT, $key);
90100
if ($data === null && $generator) {
91-
$this->storage->lock($storageKey);
101+
$this->storage->lock($storageKey);
92102
try {
93103
$data = $generator(...[&$dependencies]);
94104
} catch (\Throwable $e) {
@@ -133,12 +143,14 @@ public function bulkLoad(array $keys, callable $generator = null): array
133143
foreach ($keys as $i => $key) {
134144
$storageKey = $storageKeys[$i];
135145
if (isset($cacheData[$storageKey])) {
146+
$this->onEvent($this, self::EVENT_HIT, $key);
136147
$result[$key] = $cacheData[$storageKey];
137148
} elseif ($generator) {
138149
$result[$key] = $this->load($key, function (&$dependencies) use ($key, $generator) {
139150
return $generator(...[$key, &$dependencies]);
140151
});
141152
} else {
153+
$this->onEvent($this, self::EVENT_MISS, $key);
142154
$result[$key] = null;
143155
}
144156
}
@@ -164,27 +176,30 @@ public function bulkLoad(array $keys, callable $generator = null): array
164176
*/
165177
public function save($key, $data, array $dependencies = null)
166178
{
167-
$key = $this->generateKey($key);
179+
$storageKey = $this->generateKey($key);
168180

169181
if ($data instanceof \Closure) {
170182
trigger_error(__METHOD__ . '() closure argument is deprecated.', E_USER_WARNING);
171-
$this->storage->lock($key);
183+
$this->storage->lock($storageKey);
172184
try {
173185
$data = $data(...[&$dependencies]);
174186
} catch (\Throwable $e) {
175-
$this->storage->remove($key);
187+
$this->storage->remove($storageKey);
176188
throw $e;
177189
}
178190
}
179191

180192
if ($data === null) {
181-
$this->storage->remove($key);
193+
$this->storage->remove($storageKey);
194+
$this->onEvent($this, self::EVENT_REMOVE, $key);
182195
} else {
183196
$dependencies = $this->completeDependencies($dependencies);
184197
if (isset($dependencies[self::EXPIRATION]) && $dependencies[self::EXPIRATION] <= 0) {
185-
$this->storage->remove($key);
198+
$this->storage->remove($storageKey);
199+
$this->onEvent($this, self::EVENT_REMOVE, $key);
186200
} else {
187-
$this->storage->write($key, $data, $dependencies);
201+
$this->storage->write($storageKey, $data, $dependencies);
202+
$this->onEvent($this, self::EVENT_SAVE, $key);
188203
}
189204
return $data;
190205
}

tests/Caching/Cache.bulkLoad.phpt

+24
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,53 @@ require __DIR__ . '/Cache.php';
1717
test('storage without bulk load support', function () {
1818
$storage = new TestStorage;
1919
$cache = new Cache($storage, 'ns');
20+
$cache->onEvent[] = function (...$args) use (&$event) {
21+
$event[] = $args;
22+
};
23+
2024
Assert::same([1 => null, 2 => null], $cache->bulkLoad([1, 2]), 'data');
25+
Assert::same([[$cache, $cache::EVENT_MISS, 1], [$cache, $cache::EVENT_MISS, 2]], $event);
2126

27+
$event = [];
2228
Assert::same([1 => 1, 2 => 2], $cache->bulkLoad([1, 2], function ($key) {
2329
return $key;
2430
}));
31+
Assert::same([
32+
[$cache, $cache::EVENT_MISS, 1], [$cache, $cache::EVENT_SAVE, 1],
33+
[$cache, $cache::EVENT_MISS, 2], [$cache, $cache::EVENT_SAVE, 2],
34+
], $event);
2535

36+
$event = [];
2637
$data = $cache->bulkLoad([1, 2]);
2738
Assert::same(1, $data[1]['data']);
2839
Assert::same(2, $data[2]['data']);
40+
Assert::same([[$cache, $cache::EVENT_HIT, 1], [$cache, $cache::EVENT_HIT, 2]], $event);
2941
});
3042

3143
test('storage with bulk load support', function () {
3244
$storage = new BulkReadTestStorage;
3345
$cache = new Cache($storage, 'ns');
46+
$cache->onEvent[] = function (...$args) use (&$event) {
47+
$event[] = $args;
48+
};
49+
3450
Assert::same([1 => null, 2 => null], $cache->bulkLoad([1, 2]));
51+
Assert::same([[$cache, $cache::EVENT_MISS, 1], [$cache, $cache::EVENT_MISS, 2]], $event);
3552

53+
$event = [];
3654
Assert::same([1 => 1, 2 => 2], $cache->bulkLoad([1, 2], function ($key) {
3755
return $key;
3856
}));
57+
Assert::same([
58+
[$cache, $cache::EVENT_MISS, 1], [$cache, $cache::EVENT_SAVE, 1],
59+
[$cache, $cache::EVENT_MISS, 2], [$cache, $cache::EVENT_SAVE, 2],
60+
], $event);
3961

62+
$event = [];
4063
$data = $cache->bulkLoad([1, 2]);
4164
Assert::same(1, $data[1]['data']);
4265
Assert::same(2, $data[2]['data']);
66+
Assert::same([[$cache, $cache::EVENT_HIT, 1], [$cache, $cache::EVENT_HIT, 2]], $event);
4367
});
4468

4569
test('dependencies', function () {

tests/Caching/Cache.load.phpt

+9
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,25 @@ require __DIR__ . '/Cache.php';
1818
// load twice with fallback
1919
$storage = new TestStorage;
2020
$cache = new Cache($storage, 'ns');
21+
$cache->onEvent[] = function (...$args) use (&$event) {
22+
$event[] = $args;
23+
};
2124

2225
$value = $cache->load('key', function () {
2326
return 'value';
2427
});
2528
Assert::same('value', $value);
29+
Assert::same([
30+
[$cache, $cache::EVENT_MISS, 'key'],
31+
[$cache, $cache::EVENT_SAVE, 'key'],
32+
], $event);
2633

34+
$event = [];
2735
$data = $cache->load('key', function () {
2836
return "won't load this value"; // will read from storage
2937
});
3038
Assert::same('value', $data['data']);
39+
Assert::same([[$cache, $cache::EVENT_HIT, 'key']], $event);
3140

3241

3342
// load twice with closure fallback, pass dependencies

tests/Caching/Cache.save.phpt

+4
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ require __DIR__ . '/Cache.php';
1818
// save value with dependencies
1919
$storage = new testStorage;
2020
$cache = new Cache($storage, 'ns');
21+
$cache->onEvent[] = function (...$args) use (&$event) {
22+
$event[] = $args;
23+
};
2124
$dependencies = [Cache::TAGS => ['tag']];
2225

2326
$cache->save('key', 'value', $dependencies);
27+
Assert::same([[$cache, $cache::EVENT_SAVE, 'key']], $event);
2428

2529
$res = $cache->load('key');
2630
Assert::same('value', $res['data']);

0 commit comments

Comments
 (0)