1<?php
2
3/**
4 * SimplePie Redis Cache Extension
5 *
6 * @package SimplePie
7 * @author Jan Kozak <galvani78@gmail.com>
8 * @link http://galvani.cz/
9 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
10 * @version 0.2.9
11 */
12
13
14/**
15 * Caches data to redis
16 *
17 * Registered for URLs with the "redis" protocol
18 *
19 * For example, `redis://localhost:6379/?timeout=3600&prefix=sp_&dbIndex=0` will
20 * connect to redis on `localhost` on port 6379. All tables will be
21 * prefixed with `simple_primary-` and data will expire after 3600 seconds
22 *
23 * @package SimplePie
24 * @subpackage Caching
25 * @uses Redis
26 */
27class SimplePie_Cache_Redis implements SimplePie_Cache_Base {
28    /**
29     * Redis instance
30     *
31     * @var \Redis
32     */
33    protected $cache;
34
35    /**
36     * Options
37     *
38     * @var array
39     */
40    protected $options;
41
42    /**
43     * Cache name
44     *
45     * @var string
46     */
47    protected $name;
48
49    /**
50     * Cache Data
51     *
52     * @var type
53     */
54    protected $data;
55
56    /**
57     * Create a new cache object
58     *
59     * @param string $location Location string (from SimplePie::$cache_location)
60     * @param string $name Unique ID for the cache
61     * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
62     */
63    public function __construct($location, $name, $options = null) {
64        //$this->cache = \flow\simple\cache\Redis::getRedisClientInstance();
65        $parsed = SimplePie_Cache::parse_URL($location);
66        $redis = new Redis();
67        $redis->connect($parsed['host'], $parsed['port']);
68        if (isset($parsed['pass'])) {
69            $redis->auth($parsed['pass']);
70        }
71        if (isset($parsed['path'])) {
72            $redis->select((int)substr($parsed['path'], 1));
73        }
74        $this->cache = $redis;
75
76        if (!is_null($options) && is_array($options)) {
77            $this->options = $options;
78        } else {
79            $this->options = array (
80                'prefix' => 'rss:simple_primary:',
81                'expire' => 0,
82            );
83        }
84
85        $this->name = $this->options['prefix'] . $name;
86    }
87
88    /**
89     * @param \Redis $cache
90     */
91    public function setRedisClient(\Redis $cache) {
92        $this->cache = $cache;
93    }
94
95    /**
96     * Save data to the cache
97     *
98     * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
99     * @return bool Successfulness
100     */
101    public function save($data) {
102        if ($data instanceof SimplePie) {
103            $data = $data->data;
104        }
105        $response = $this->cache->set($this->name, serialize($data));
106        if ($this->options['expire']) {
107            $this->cache->expire($this->name, $this->options['expire']);
108        }
109
110        return $response;
111    }
112
113    /**
114     * Retrieve the data saved to the cache
115     *
116     * @return array Data for SimplePie::$data
117     */
118    public function load() {
119        $data = $this->cache->get($this->name);
120
121        if ($data !== false) {
122            return unserialize($data);
123        }
124        return false;
125    }
126
127    /**
128     * Retrieve the last modified time for the cache
129     *
130     * @return int Timestamp
131     */
132    public function mtime() {
133
134        $data = $this->cache->get($this->name);
135
136        if ($data !== false) {
137            return time();
138        }
139
140        return false;
141    }
142
143    /**
144     * Set the last modified time to the current time
145     *
146     * @return bool Success status
147     */
148    public function touch() {
149
150        $data = $this->cache->get($this->name);
151
152        if ($data !== false) {
153            $return = $this->cache->set($this->name, $data);
154            if ($this->options['expire']) {
155                return $this->cache->expire($this->name, $this->ttl);
156            }
157            return $return;
158        }
159
160        return false;
161    }
162
163    /**
164     * Remove the cache
165     *
166     * @return bool Success status
167     */
168    public function unlink() {
169        return $this->cache->set($this->name, null);
170    }
171
172}
173