-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathMemcachedCachePool.php
119 lines (102 loc) · 2.87 KB
/
MemcachedCachePool.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
/*
* This file is part of php-cache organization.
*
* (c) 2015 Aaron Scherer <[email protected]>, Tobias Nyholm <[email protected]>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Cache\Adapter\Memcached;
use Cache\Adapter\Common\AbstractCachePool;
use Cache\Adapter\Common\PhpCacheItem;
use Cache\Adapter\Common\TagSupportWithArray;
use Cache\Hierarchy\HierarchicalCachePoolTrait;
use Cache\Hierarchy\HierarchicalPoolInterface;
/**
* @author Aaron Scherer <[email protected]>
* @author Tobias Nyholm <[email protected]>
*/
class MemcachedCachePool extends AbstractCachePool implements HierarchicalPoolInterface
{
use HierarchicalCachePoolTrait;
use TagSupportWithArray;
/**
* @type \Memcached
*/
protected $cache;
/**
* @param \Memcached $cache
*/
public function __construct(\Memcached $cache)
{
$this->cache = $cache;
$this->cache->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
}
/**
* {@inheritdoc}
*/
protected function fetchObjectFromCache($key)
{
if (false === $result = unserialize($this->cache->get($this->getHierarchyKey($key)))) {
return [false, null, [], null];
}
return $result;
}
/**
* {@inheritdoc}
*/
protected function clearAllObjectsFromCache()
{
return $this->cache->flush();
}
/**
* {@inheritdoc}
*/
protected function clearOneObjectFromCache($key)
{
$this->commit();
$path = null;
$key = $this->getHierarchyKey($key, $path);
if ($path) {
$this->cache->increment($path, 1, 0);
}
$this->clearHierarchyKeyCache();
if ($this->cache->delete($key)) {
return true;
}
// Return true if key not found
return $this->cache->getResultCode() === \Memcached::RES_NOTFOUND;
}
/**
* {@inheritdoc}
*/
protected function storeItemInCache(PhpCacheItem $item, $ttl)
{
if ($ttl === null) {
$ttl = 0;
} elseif ($ttl < 0) {
return false;
} elseif ($ttl > 86400 * 30) {
// Any time higher than 30 days is interpreted as a unix timestamp date.
// https://github.com/memcached/memcached/wiki/Programming#expiration
$ttl = time() + $ttl;
}
$key = $this->getHierarchyKey($item->getKey());
return $this->cache->set($key, serialize([true, $item->get(), $item->getTags(), $item->getExpirationTimestamp()]), $ttl);
}
/**
* {@inheritdoc}
*/
public function getDirectValue($name)
{
return $this->cache->get($name);
}
/**
* {@inheritdoc}
*/
public function setDirectValue($name, $value)
{
$this->cache->set($name, $value);
}
}