* @package Mammut\Cache */ class Memcache extends \Mammut\StrictObject implements \Mammut\Cache\iCache { const OPT_BACKEND = 'backend'; /** * * @var Memcache */ protected $memcache; /** * * @var \Memcached */ protected $memcached; private $hits = 0; private $api = false; private $prefix; public static function getBackendType() { // prefer memcached, which is linked to libmemcached if(extension_loaded('memcached')) return 'memcached'; // fall back to libless extension, if avaible if(extension_loaded('memcache')) return 'memcache'; return false; } public function __construct($server, $port, $prefix, array $options = array()) { if(!(extension_loaded('memcache') || extension_loaded('memcached'))) throw new ExtensionException('memcache(d)'); $this->api = isset($options[self::OPT_BACKEND]) ? $options[self::OPT_BACKEND] : self::getBackendType(); switch($this->api) { case 'memcached': $this->memcached = new \Memcached(); $this->memcached->setOption(\Memcached::OPT_PREFIX_KEY, $prefix); if(key_exists('user', $options)) { if(!method_exists($this->memcached, 'setSaslAuthData')) throw new \RuntimeException('extension is build without sasl support, authentication not avaible'); $this->memcached->setSaslAuthData($options['user'], $options['passwd']); } if(is_array($server)) $this->memcached->addServers($server); else $this->memcached->addServer($server, $port); break; case 'memcache': $this->memcache = new \Memcache(); $this->memcache->pconnect($server, $port, 30); $this->prefix = $prefix; break; } } public function set($key, $value, $ttl) { if ($value instanceof \Closure) $value = $value(); switch($this->api) { case 'memcached': return $this->memcached->set($key, $value, $ttl); case 'memcache': $key = $this->prefix . $key; return $this->memcache->set($key, $value, 0, $ttl); } } public function get($key, $default = NULL) { $this->api == 'memcached' || $key = $this->prefix . $key; $value = $this->{$this->api}->get($key); if(is_null($value) || $value === false) { if ($default instanceof \Closure) $value = $default(); else $value = $default; } else $this->hits++; return $value; } public function delete($key) { $this->api == 'memcached' || $key = $this->prefix . $key; $this->{$this->api}->delete($key); } public function keyExists($key) { switch($this->api) { case 'memcached': return (boolean) ($this->memcached->get($key) !== false); case 'memcache': $key = $this->prefix . $key; return (boolean) ($this->memcache->get($key) !== false); } } public function clear() { $this->{$this->api}->flush(); } public function getHits() { return $this->hits; } public function getStatistics() { $result = array(); switch($this->api) { case 'memcached': var_dump($this->memcached); var_dump($this->memcached->getStats()); var_dump($this->memcached->getVersion()); $stats = $this->memcached->getStats(); if(!empty($stats)) { foreach($stats as $server=>$serverstats) { $result[$server]['version'] = $serverstats['version']; } } break; case 'memcache': var_dump($this->memcache); var_dump($this->memcache->getStats()); var_dump($this->memcache->getExtendedStats()); // var_dump($this->memcached->getVersion()); // $stats = $this->memcached->getStats(); if(!empty($stats)) { foreach($stats as $server=>$serverstats) { $result[$server]['version'] = $serverstats['version']; } } break; } return $result; } }