CodeIgniter installed
[living-lab-site.git] / system / libraries / Cache / drivers / Cache_memcached.php
1 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2 /**
3  * CodeIgniter
4  *
5  * An open source application development framework for PHP 4.3.2 or newer
6  *
7  * @package             CodeIgniter
8  * @author              ExpressionEngine Dev Team
9  * @copyright   Copyright (c) 2006 - 2011 EllisLab, Inc.
10  * @license             http://codeigniter.com/user_guide/license.html
11  * @link                http://codeigniter.com
12  * @since               Version 2.0
13  * @filesource  
14  */
15
16 // ------------------------------------------------------------------------
17
18 /**
19  * CodeIgniter Memcached Caching Class 
20  *
21  * @package             CodeIgniter
22  * @subpackage  Libraries
23  * @category    Core
24  * @author              ExpressionEngine Dev Team
25  * @link                
26  */
27
28 class CI_Cache_memcached extends CI_Driver {
29
30         private $_memcached;    // Holds the memcached object
31
32         protected $_memcache_conf       = array(
33                                         'default' => array(
34                                                 'default_host'          => '127.0.0.1',
35                                                 'default_port'          => 11211,
36                                                 'default_weight'        => 1
37                                         )
38                                 );
39
40         // ------------------------------------------------------------------------     
41
42         /**
43          * Fetch from cache
44          *
45          * @param       mixed           unique key id
46          * @return      mixed           data on success/false on failure
47          */     
48         public function get($id)
49         {       
50                 $data = $this->_memcached->get($id);
51                 
52                 return (is_array($data)) ? $data[0] : FALSE;
53         }
54
55         // ------------------------------------------------------------------------
56
57         /**
58          * Save
59          *
60          * @param       string          unique identifier
61          * @param       mixed           data being cached
62          * @param       int                     time to live
63          * @return      boolean         true on success, false on failure
64          */
65         public function save($id, $data, $ttl = 60)
66         {
67                 return $this->_memcached->add($id, array($data, time(), $ttl), $ttl);
68         }
69
70         // ------------------------------------------------------------------------
71         
72         /**
73          * Delete from Cache
74          *
75          * @param       mixed           key to be deleted.
76          * @return      boolean         true on success, false on failure
77          */
78         public function delete($id)
79         {
80                 return $this->_memcached->delete($id);
81         }
82
83         // ------------------------------------------------------------------------
84         
85         /**
86          * Clean the Cache
87          *
88          * @return      boolean         false on failure/true on success
89          */
90         public function clean()
91         {
92                 return $this->_memcached->flush();
93         }
94
95         // ------------------------------------------------------------------------
96
97         /**
98          * Cache Info
99          *
100          * @param       null            type not supported in memcached
101          * @return      mixed           array on success, false on failure
102          */
103         public function cache_info($type = NULL)
104         {
105                 return $this->_memcached->getStats();
106         }
107
108         // ------------------------------------------------------------------------
109         
110         /**
111          * Get Cache Metadata
112          *
113          * @param       mixed           key to get cache metadata on
114          * @return      mixed           FALSE on failure, array on success.
115          */
116         public function get_metadata($id)
117         {
118                 $stored = $this->_memcached->get($id);
119
120                 if (count($stored) !== 3)
121                 {
122                         return FALSE;
123                 }
124
125                 list($data, $time, $ttl) = $stored;
126
127                 return array(
128                         'expire'        => $time + $ttl,
129                         'mtime'         => $time,
130                         'data'          => $data
131                 );
132         }
133
134         // ------------------------------------------------------------------------
135
136         /**
137          * Setup memcached.
138          */
139         private function _setup_memcached()
140         {
141                 // Try to load memcached server info from the config file.
142                 $CI =& get_instance();
143                 if ($CI->config->load('memcached', TRUE, TRUE))
144                 {
145                         if (is_array($CI->config->config['memcached']))
146                         {
147                                 $this->_memcache_conf = NULL;
148
149                                 foreach ($CI->config->config['memcached'] as $name => $conf)
150                                 {
151                                         $this->_memcache_conf[$name] = $conf;
152                                 }                               
153                         }                       
154                 }
155                 
156                 $this->_memcached = new Memcached();
157
158                 foreach ($this->_memcache_conf as $name => $cache_server)
159                 {
160                         if ( ! array_key_exists('hostname', $cache_server))
161                         {
162                                 $cache_server['hostname'] = $this->_default_options['default_host'];
163                         }
164         
165                         if ( ! array_key_exists('port', $cache_server))
166                         {
167                                 $cache_server['port'] = $this->_default_options['default_port'];
168                         }
169         
170                         if ( ! array_key_exists('weight', $cache_server))
171                         {
172                                 $cache_server['weight'] = $this->_default_options['default_weight'];
173                         }
174         
175                         $this->_memcached->addServer(
176                                         $cache_server['hostname'], $cache_server['port'], $cache_server['weight']
177                         );
178                 }
179         }
180
181         // ------------------------------------------------------------------------
182
183
184         /**
185          * Is supported
186          *
187          * Returns FALSE if memcached is not supported on the system.
188          * If it is, we setup the memcached object & return TRUE
189          */
190         public function is_supported()
191         {
192                 if ( ! extension_loaded('memcached'))
193                 {
194                         log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.');
195                         
196                         return FALSE;
197                 }
198                 
199                 $this->_setup_memcached();
200                 return TRUE;
201         }
202
203         // ------------------------------------------------------------------------
204
205 }
206 // End Class
207
208 /* End of file Cache_memcached.php */
209 /* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */