Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17002 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Cache;


class CacheImpl implements CacheInterface
{
    
    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private static $_instance;
    
    
    /**
     *
     * @var \Memcached
     */
    private $cache;
    
    
    /**
     *
     * @var string
     */
    private $namespace;
    
    /**
     *
     * @var int
     */
    private $ttl;
    
    
    /**
     *
     * @param Array $config
     */
    private function __construct($config)
    {
        

        $this->ttl          = intval($config['leaderslinked.memcache.ttl'], 10);
        $this->namespace    = strval($config['leaderslinked.memcache.namespace']);
        $host               = strval($config['leaderslinked.memcache.host']);
        $port               = intval($config['leaderslinked.memcache.port'], 10);
        
        
        $this->cache = new \Memcached();
        $this->cache->addserver($host, $port);
        
        
        
    }
    
    /**
     *
     * @param array $config
     * @return \LeadersLinked\Cache\CacheInterface
     */
    public static function getInstance($config)
    {
        if(self::$_instance == null) {
            self::$_instance = new CacheImpl($config);
        }
        return self::$_instance;
    }
    
    
    /**
     *
     * @param string $key
     * @param mixed $value
     * @param int $ttl
     */
    public function setItem($key, $value, $ttl = 0)
    {
        $ttl = $ttl ? $ttl : $this->ttl;
        $key = $this->namespace ? $this->namespace . '-' . $key : $key;
        
        if($this->hasItem($key)) {
            
            $this->cache->replace($key, serialize($value), time() + $ttl);
        } else {
            $this->cache->add($key, serialize($value), time() + $ttl);
        }
    }

    /**
     *
     * @param string $key
     * @return boolean
     */
    public function removeItem($key)
    {
        if($this->hasItem($key)) {
            $key = $this->namespace ? $this->namespace . '-' . $key : $key;
            
            return $this->cache->delete($key);
        } else {
            return true;
        }
    }
    
    /**
     *
     * {@inheritDoc}
     * @see \LeadersLinked\Cache\CacheInterface::getAll()
     */
    public function getAll()
    {
        return $this->cache->fetchAll();
    }

    /**
     * 
     * {@inheritDoc}
     * @see \LeadersLinked\Cache\CacheInterface::hasItem()
     */
    public function hasItem($key)
    {
        $key = $this->namespace ? $this->namespace . '-' . $key : $key;
        
        $keys = $this->cache->getAllKeys();
        if ($keys === false) {
            return false;
        }
        return in_array($key, $keys, true);
    }

    /**
     * 
     * {@inheritDoc}
     * @see \LeadersLinked\Cache\CacheInterface::getItem()
     */
    public function getItem($key)
    {
        if($this->hasItem($key)) {
            $key = $this->namespace ? $this->namespace . '-' . $key : $key;
            
            $value = $this->cache->get($key);
            if(is_string($value)) {
                return unserialize($value);
            } else {
                return $value;
            }
        } else {
            return null;
        }
    }
    
}