Вход Регистрация
Файл: oc-includes/osclass/core/caches/Object_Cache_memcache.php
Строк: 193
<?php
/**
 * Object_Cache_memcache class
 */
class Object_Cache_memcache implements iObject_Cache{

   
/**
     * Holds the memcached object
     *
     * @var array
     * @access private
     * @since 3.4
     */
    
private $_memcached;

    protected 
$_memcache_conf     = array(
        
'default' => array(
            
'default_host' => '127.0.0.1',
            
'default_port' => 11211,
            
'default_weight' => 1
        
)
    );

    
/**
     * The amount of times the cache data was already stored in the cache.
     *
     * @since 3.4
     * @access private
     * @var int
     */
    
var $cache_hits 0;

    
/**
     * Amount of times the cache did not have the request in cache
     *
     * @var int
     * @access public
     * @since 3.4
     */
    
var $cache_misses 0;

    
/**
     * The blog prefix to prepend to keys in non-global groups.
     *
     * @var int
     * @access private
     * @since 3.4
     */
    
var $site_prefix;
    var 
$multisite;
    var 
$default_expiration 60;

    
/**
     * Adds data to the cache if it doesn't already exist.
     * @since 3.4
     *
     * @param int|string $key What to call the contents in the cache
     * @param mixed $data The contents to store in the cache
     * @param int $expire When to expire the cache contents
     * @return bool False if cache key and group already exist, true on success
     */
    
function add$key$data$expire ) {
        
$id $key;
        if ( 
$this->multisite ) {
            
$id $this->site_prefix $key;
        }

        if ( 
is_object$data ) ) {
            
$data = clone $data;
        }

        
$store_data $data;

        if ( 
is_array$data ) ) {
            
$store_data = new ArrayObject$data );
        }

        
$expire = ( $expire == ) ? $this->default_expiration $expire;
        
$result  $this->_memcached->add($key, array($store_datatime(), $expire), 0$expire);
        if ( 
false !== $result ) {
            
$this->cache[$key] = $data;
        }

        return 
$result;
    }

    
/**
     * Remove the contents of the cache key in the group
     * @since 3.4
     *
     * @param int|string $key What the contents in the cache are called
     * @return bool False if the contents weren't deleted and true on success
     */
    
function delete($key) {

        if ( 
$this->multisite ) {
            
$key $this->site_prefix $key;
        }

        
$result $this->_memcached->delete($key);
        if ( 
false !== $result ) {
            unset( 
$this->cache[$key] );
        }
        return 
$result;
    }

    
/**
     * Clears the object cache of all data
     * @since 3.4
     *
     * @return bool Always returns true
     */
    
function flush() {
        
$this->cache = array ();
        return 
$this->_memcached->flush();
    }

    
/**
     * Retrieves the cache contents, if it exists
     * @since 3.4
     *
     * @param int|string $key What the contents in the cache are called
     * @param bool $found if can be retrieved from cache
     * @return bool|mixed False on failure to retrieve contents or the cache
     *        contents on success
     */
    
function get$key, &$found null ) {
        
$found false;
        if ( 
$this->multisite )
            
$key $this->site_prefix $key;

        if ( isset(
$this->cache[$key]) ) {
            
$found true;
            if ( 
is_object$this->cache[$key] ) ) {
                
$value = clone $this->cache[$key];
            } else {
                
$value $this->cache[$key];
            }
            
$this->cache_hits += 1;
            
$return $value;
        } else {
            
$found true;
            
$value $this->_memcached->get($key);
            if ( 
is_object$value ) && 'ArrayObject' == get_class$value ) ) {
                
$value $value->getArrayCopy();
            }
            if ( 
NULL === $value ) {
                
$found false;
                
$value false;
            }

            
$this->cache[$key] = ( is_object$value ) ) ? clone $value $value;
            if(
$found) {
                
$this->cache_hits += 1;
                
$return $this->cache[$key];
            } else {
                
$this->cache_misses += 1;
                
$return false;
            }


        }
        return 
$return;

    }

    
/**
     * Sets the data contents into the cache
     * @since 3.4
     *
     * @param int|string $key What to call the contents in the cache
     * @param mixed $data The contents to store in the cache
     * @param int $expire Not Used
     * @return bool Always returns true on success, false on failure
     */
    
function set($key$data$expire 0) {
        if (
$this->multisite)
            
$key $this->site_prefix $key;

        if (
is_object($data))
            
$data = clone $data;

        
$store_data $data;

        if (
is_array($data))
            
$store_data = new ArrayObject($data);

        
$this->cache[$key] = $data;

        
$expire = ( $expire == ) ? $this->default_expiration $expire;

        
$result $this->_memcached->set($key$store_data0$expire);

        return 
$result;
    }

    
/**
     * Echoes the stats of the caching.
     * Gives the cache hits, and cache misses.
     *
     * @since 3.4
     */
    
function stats() {
        echo 
"<div style='position:absolute; width:200px;top:0px;'><div style='float:right;margin-right:30px;margin-top:15px;border: 1px red solid;
border-radius: 17px;
padding: 1em;'><h2>Memcache stats</h2>"
;
        echo 
"<p>";
        echo 
"<strong>Cache Hits:</strong> {$this->cache_hits}<br />";
        echo 
"<strong>Cache Misses:</strong> {$this->cache_misses}<br />";
        echo 
"</p>";
        echo 
'<ul>';
        echo 
'</ul></div></div>';
    }

    
/**
     * Utility function to determine whether a key exists in the cache.
     *
     * @since 3.4.0
     *
     * @access protected
     */
    
protected function _exists$key ) {
        return isset( 
$this->cache$key ] );
    }

    
/**
     * Sets up object properties; PHP 5 style constructor
     *
     * @since 3.4
     */
    
function __construct() {

        
$this->multisite false;
//        if(SiteInfo::newInstance()->siteInfo!=array()) {
//            $info       = SiteInfo::newInstance()->siteInfo;
//            $site_id    = osc_sanitizeString($info);
//            $this->multisite = true;
//        }

        
$site_id '';
        
$this->site_prefix =  $this->multisite $site_id ':' '';
        
$cache_server = array();
        global 
$_cache_config;
        if( !isset(
$_cache_config) && !is_array($_cache_config) ) {
            
$_t['hostname'] = $this->_memcache_conf['default']['default_host'];
            
$_t['port']     = $this->_memcache_conf['default']['default_port'];
            
$_t['weight']   = $this->_memcache_conf['default']['default_weight'];
            
$cache_server[] = $_t;
        } else {
            foreach(
$_cache_config as $_server) {
                
$_array = array(
                    
'hostname' => $_server['default_host'],
                    
'port'     => $_server['default_port'],
                    
'weight'   => $_server['default_weight']
                );
                
$cache_server[] = $_array;
            }
        }

        
$this->_memcached = new Memcache();
        foreach(
$cache_server as $_config) {
            
$this->_memcached->addServer($_config['hostname'], $_config['port'], $_config['weight']);
        }
    }

    
/**
     * is_supported()
     *
     * Check to see if Memcache is available on this system, bail if it isn't.
     */
    
static function is_supported() {
        if ( !
class_exists('Memcache') ) {
            
error_log('The Memcached Extension must be loaded to use Memcached Cache.');
            return 
false;
        }
        return 
true;
    }

    function 
__destruct() {
        return 
true;
    }

    function 
_get_cache() {
        return 
'memcache';
    }
}
Онлайн: 1
Реклама