]> git.mxchange.org Git - friendica.git/blob - src/Core/Cache/MemcacheCacheDriver.php
563447ef1e438b0a193399bbdd3f348766599fac
[friendica.git] / src / Core / Cache / MemcacheCacheDriver.php
1 <?php\r
2 \r
3 namespace Friendica\Core\Cache;\r
4 \r
5 use Friendica\BaseObject;\r
6 use Friendica\Core\Cache;\r
7 \r
8 /**\r
9  * Memcache Cache Driver\r
10  *\r
11  * @author Hypolite Petovan <mrpetovan@gmail.com>\r
12  */\r
13 class MemcacheCacheDriver extends BaseObject implements ICacheDriver\r
14 {\r
15         /**\r
16          * @var Memcache\r
17          */\r
18         private $memcache;\r
19 \r
20         public function __construct($memcache_host, $memcache_port)\r
21         {\r
22                 if (!class_exists('Memcache', false)) {\r
23                         throw new \Exception('Memcache class isn\'t available');\r
24                 }\r
25 \r
26                 $this->memcache = new \Memcache();\r
27 \r
28                 if (!$this->memcache->connect($memcache_host, $memcache_port)) {\r
29                         throw new \Exception('Expected Memcache server at ' . $memcache_host . ':' . $memcache_port . ' isn\'t available');\r
30                 }\r
31         }\r
32 \r
33         public function get($key)\r
34         {\r
35                 $return = null;\r
36 \r
37                 // We fetch with the hostname as key to avoid problems with other applications\r
38                 $cached = $this->memcache->get(self::getApp()->get_hostname() . ':' . $key);\r
39 \r
40                 // @see http://php.net/manual/en/memcache.get.php#84275\r
41                 if (is_bool($cached) || is_double($cached) || is_long($cached)) {\r
42                         return $return;\r
43                 }\r
44 \r
45                 $value = @unserialize($cached);\r
46 \r
47                 // Only return a value if the serialized value is valid.\r
48                 // We also check if the db entry is a serialized\r
49                 // boolean 'false' value (which we want to return).\r
50                 if ($cached === serialize(false) || $value !== false) {\r
51                         $return = $value;\r
52                 }\r
53 \r
54                 return $return;\r
55         }\r
56 \r
57         public function set($key, $value, $duration = Cache::MONTH)\r
58         {\r
59                 // We store with the hostname as key to avoid problems with other applications\r
60                 return $this->memcache->set(\r
61                         self::getApp()->get_hostname() . ":" . $key,\r
62                         serialize($value),\r
63                         MEMCACHE_COMPRESSED,\r
64                         time() + $duration\r
65                 );\r
66         }\r
67 \r
68         public function delete($key)\r
69         {\r
70                 return $this->memcache->delete($key);\r
71         }\r
72 \r
73         public function clear()\r
74         {\r
75                 return true;\r
76         }\r
77 }\r