CodeIgniter installed
[living-lab-site.git] / system / libraries / Cache / drivers / Cache_memcached.php
diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php
new file mode 100755 (executable)
index 0000000..ec2fd21
--- /dev/null
@@ -0,0 +1,209 @@
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package            CodeIgniter
+ * @author             ExpressionEngine Dev Team
+ * @copyright  Copyright (c) 2006 - 2011 EllisLab, Inc.
+ * @license            http://codeigniter.com/user_guide/license.html
+ * @link               http://codeigniter.com
+ * @since              Version 2.0
+ * @filesource 
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Memcached Caching Class 
+ *
+ * @package            CodeIgniter
+ * @subpackage Libraries
+ * @category   Core
+ * @author             ExpressionEngine Dev Team
+ * @link               
+ */
+
+class CI_Cache_memcached extends CI_Driver {
+
+       private $_memcached;    // Holds the memcached object
+
+       protected $_memcache_conf       = array(
+                                       'default' => array(
+                                               'default_host'          => '127.0.0.1',
+                                               'default_port'          => 11211,
+                                               'default_weight'        => 1
+                                       )
+                               );
+
+       // ------------------------------------------------------------------------     
+
+       /**
+        * Fetch from cache
+        *
+        * @param       mixed           unique key id
+        * @return      mixed           data on success/false on failure
+        */     
+       public function get($id)
+       {       
+               $data = $this->_memcached->get($id);
+               
+               return (is_array($data)) ? $data[0] : FALSE;
+       }
+
+       // ------------------------------------------------------------------------
+
+       /**
+        * Save
+        *
+        * @param       string          unique identifier
+        * @param       mixed           data being cached
+        * @param       int                     time to live
+        * @return      boolean         true on success, false on failure
+        */
+       public function save($id, $data, $ttl = 60)
+       {
+               return $this->_memcached->add($id, array($data, time(), $ttl), $ttl);
+       }
+
+       // ------------------------------------------------------------------------
+       
+       /**
+        * Delete from Cache
+        *
+        * @param       mixed           key to be deleted.
+        * @return      boolean         true on success, false on failure
+        */
+       public function delete($id)
+       {
+               return $this->_memcached->delete($id);
+       }
+
+       // ------------------------------------------------------------------------
+       
+       /**
+        * Clean the Cache
+        *
+        * @return      boolean         false on failure/true on success
+        */
+       public function clean()
+       {
+               return $this->_memcached->flush();
+       }
+
+       // ------------------------------------------------------------------------
+
+       /**
+        * Cache Info
+        *
+        * @param       null            type not supported in memcached
+        * @return      mixed           array on success, false on failure
+        */
+       public function cache_info($type = NULL)
+       {
+               return $this->_memcached->getStats();
+       }
+
+       // ------------------------------------------------------------------------
+       
+       /**
+        * Get Cache Metadata
+        *
+        * @param       mixed           key to get cache metadata on
+        * @return      mixed           FALSE on failure, array on success.
+        */
+       public function get_metadata($id)
+       {
+               $stored = $this->_memcached->get($id);
+
+               if (count($stored) !== 3)
+               {
+                       return FALSE;
+               }
+
+               list($data, $time, $ttl) = $stored;
+
+               return array(
+                       'expire'        => $time + $ttl,
+                       'mtime'         => $time,
+                       'data'          => $data
+               );
+       }
+
+       // ------------------------------------------------------------------------
+
+       /**
+        * Setup memcached.
+        */
+       private function _setup_memcached()
+       {
+               // Try to load memcached server info from the config file.
+               $CI =& get_instance();
+               if ($CI->config->load('memcached', TRUE, TRUE))
+               {
+                       if (is_array($CI->config->config['memcached']))
+                       {
+                               $this->_memcache_conf = NULL;
+
+                               foreach ($CI->config->config['memcached'] as $name => $conf)
+                               {
+                                       $this->_memcache_conf[$name] = $conf;
+                               }                               
+                       }                       
+               }
+               
+               $this->_memcached = new Memcached();
+
+               foreach ($this->_memcache_conf as $name => $cache_server)
+               {
+                       if ( ! array_key_exists('hostname', $cache_server))
+                       {
+                               $cache_server['hostname'] = $this->_default_options['default_host'];
+                       }
+       
+                       if ( ! array_key_exists('port', $cache_server))
+                       {
+                               $cache_server['port'] = $this->_default_options['default_port'];
+                       }
+       
+                       if ( ! array_key_exists('weight', $cache_server))
+                       {
+                               $cache_server['weight'] = $this->_default_options['default_weight'];
+                       }
+       
+                       $this->_memcached->addServer(
+                                       $cache_server['hostname'], $cache_server['port'], $cache_server['weight']
+                       );
+               }
+       }
+
+       // ------------------------------------------------------------------------
+
+
+       /**
+        * Is supported
+        *
+        * Returns FALSE if memcached is not supported on the system.
+        * If it is, we setup the memcached object & return TRUE
+        */
+       public function is_supported()
+       {
+               if ( ! extension_loaded('memcached'))
+               {
+                       log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.');
+                       
+                       return FALSE;
+               }
+               
+               $this->_setup_memcached();
+               return TRUE;
+       }
+
+       // ------------------------------------------------------------------------
+
+}
+// End Class
+
+/* End of file Cache_memcached.php */
+/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */
\ No newline at end of file