Skip to content

Commit 933fb18

Browse files
committed
add filesystem cache (adapter|simple) prune method
1 parent 0bcc5af commit 933fb18

File tree

3 files changed

+164
-0
lines changed

3 files changed

+164
-0
lines changed

src/Symfony/Component/Cache/Tests/Adapter/FilesystemAdapterTest.php

+76
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,80 @@ public static function rmdir($dir)
4949
}
5050
rmdir($dir);
5151
}
52+
53+
public function testPrune()
54+
{
55+
if (isset($this->skippedTests[__FUNCTION__])) {
56+
$this->markTestSkipped($this->skippedTests[__FUNCTION__]);
57+
58+
return;
59+
}
60+
61+
$cache = $this->createCachePool();
62+
63+
$isHit = function ($name) use ($cache) {
64+
return $cache->getItem($name)->isHit();
65+
};
66+
67+
$doSet = function ($name, $value, \DateInterval $expiresAfter = null) use ($cache) {
68+
$item = $cache->getItem($name);
69+
$item->set($value);
70+
71+
if ($expiresAfter) {
72+
$item->expiresAfter($expiresAfter);
73+
}
74+
75+
$cache->save($item);
76+
};
77+
78+
$setUp = function () use ($cache, $doSet) {
79+
$doSet('foo', 'foo-val');
80+
$doSet('bar', 'bar-val', new \DateInterval('PT20S'));
81+
$doSet('baz', 'baz-val', new \DateInterval('PT40S'));
82+
$doSet('qux', 'qux-val', new \DateInterval('PT80S'));
83+
};
84+
85+
$setUp();
86+
87+
$cache->prune();
88+
$this->assertTrue($isHit('foo'));
89+
$this->assertTrue($isHit('bar'));
90+
$this->assertTrue($isHit('baz'));
91+
$this->assertTrue($isHit('qux'));
92+
93+
sleep(30);
94+
$cache->prune();
95+
$this->assertTrue($isHit('foo'));
96+
$this->assertFalse($isHit('bar'));
97+
$this->assertTrue($isHit('baz'));
98+
$this->assertTrue($isHit('qux'));
99+
100+
sleep(30);
101+
$cache->prune();
102+
$this->assertTrue($isHit('foo'));
103+
$this->assertFalse($isHit('baz'));
104+
$this->assertTrue($isHit('qux'));
105+
106+
sleep(30);
107+
$cache->prune();
108+
$this->assertTrue($isHit('foo'));
109+
$this->assertFalse($isHit('qux'));
110+
111+
$setUp();
112+
113+
$cache->prune(new \DateInterval('PT30S'));
114+
$this->assertTrue($isHit('foo'));
115+
$this->assertFalse($isHit('bar'));
116+
$this->assertTrue($isHit('baz'));
117+
$this->assertTrue($isHit('qux'));
118+
119+
$cache->prune(new \DateInterval('PT60S'));
120+
$this->assertTrue($isHit('foo'));
121+
$this->assertFalse($isHit('baz'));
122+
$this->assertTrue($isHit('qux'));
123+
124+
$cache->prune(new \DateInterval('PT90S'));
125+
$this->assertTrue($isHit('foo'));
126+
$this->assertFalse($isHit('qux'));
127+
}
52128
}

src/Symfony/Component/Cache/Tests/Simple/FilesystemCacheTest.php

+69
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,73 @@ public function createSimpleCache($defaultLifetime = 0)
2222
{
2323
return new FilesystemCache('', $defaultLifetime);
2424
}
25+
26+
public function testPrune()
27+
{
28+
if (isset($this->skippedTests[__FUNCTION__])) {
29+
$this->markTestSkipped($this->skippedTests[__FUNCTION__]);
30+
31+
return;
32+
}
33+
34+
$cache = $this->createSimpleCache();
35+
36+
$isHit = function ($name) use ($cache) {
37+
return $cache->has($name);
38+
};
39+
40+
$doSet = function ($name, $value, \DateInterval $expiresAfter = null) use ($cache) {
41+
$cache->set($name, $value, $expiresAfter);
42+
};
43+
44+
$setUp = function () use ($cache, $doSet) {
45+
$doSet('foo', 'foo-val');
46+
$doSet('bar', 'bar-val', new \DateInterval('PT20S'));
47+
$doSet('baz', 'baz-val', new \DateInterval('PT40S'));
48+
$doSet('qux', 'qux-val', new \DateInterval('PT80S'));
49+
};
50+
51+
$setUp();
52+
53+
$cache->prune();
54+
$this->assertTrue($isHit('foo'));
55+
$this->assertTrue($isHit('bar'));
56+
$this->assertTrue($isHit('baz'));
57+
$this->assertTrue($isHit('qux'));
58+
59+
sleep(30);
60+
$cache->prune();
61+
$this->assertTrue($isHit('foo'));
62+
$this->assertFalse($isHit('bar'));
63+
$this->assertTrue($isHit('baz'));
64+
$this->assertTrue($isHit('qux'));
65+
66+
sleep(30);
67+
$cache->prune();
68+
$this->assertTrue($isHit('foo'));
69+
$this->assertFalse($isHit('baz'));
70+
$this->assertTrue($isHit('qux'));
71+
72+
sleep(30);
73+
$cache->prune();
74+
$this->assertTrue($isHit('foo'));
75+
$this->assertFalse($isHit('qux'));
76+
77+
$setUp();
78+
79+
$cache->prune(new \DateInterval('PT30S'));
80+
$this->assertTrue($isHit('foo'));
81+
$this->assertFalse($isHit('bar'));
82+
$this->assertTrue($isHit('baz'));
83+
$this->assertTrue($isHit('qux'));
84+
85+
$cache->prune(new \DateInterval('PT60S'));
86+
$this->assertTrue($isHit('foo'));
87+
$this->assertFalse($isHit('baz'));
88+
$this->assertTrue($isHit('qux'));
89+
90+
$cache->prune(new \DateInterval('PT90S'));
91+
$this->assertTrue($isHit('foo'));
92+
$this->assertFalse($isHit('qux'));
93+
}
2594
}

src/Symfony/Component/Cache/Traits/FilesystemTrait.php

+19
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ trait FilesystemTrait
2222
{
2323
use FilesystemCommonTrait;
2424

25+
/**
26+
* @param \DateInterval|null $time
27+
*
28+
* @return bool
29+
*/
30+
public function prune(\DateInterval $time = null)
31+
{
32+
$time = $time ? \DateTime::createFromFormat('U', time())->add($time)->format('U') : time();
33+
$ok = true;
34+
35+
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY, \RecursiveIteratorIterator::CATCH_GET_CHILD) as $file) {
36+
if ($time >= $file->getMTime()) {
37+
$ok = (@unlink($file) || !file_exists($file)) && $ok;
38+
}
39+
}
40+
41+
return $ok;
42+
}
43+
2544
/**
2645
* {@inheritdoc}
2746
*/

0 commit comments

Comments
 (0)