Seditio Source
Root |
./othercms/dle15_0/upload/engine/classes/memcache.class.php
<?php
/*
=====================================================
 DataLife Engine - by SoftNews Media Group
-----------------------------------------------------
 http://dle-news.ru/
-----------------------------------------------------
 Copyright (c) 2004-2021 SoftNews Media Group
=====================================================
 This code is protected by copyright
=====================================================
 File: memcache.class.php
-----------------------------------------------------
 Use: memcache class
=====================================================
*/

if( !defined( 'DATALIFEENGINE' ) ) {
   
header( "HTTP/1.1 403 Forbidden" );
   
header ( 'Location: ../../' );
    die(
"Hacking attempt!" );
}

class
dle_fastcache
{
    protected
$server = null;
    protected
$suite_key = null;
    protected
$server_type = null;
    protected
$max_age = null;
   
    protected
$host = null;
    protected
$port = null;
   
    public
$connection = null;
   
    public function
__construct( $config ) {
       
       
$this->suite_key = md5( DBNAME . PREFIX . SECURE_AUTH_KEY );
       
       
$this->server = $this->connect();
       
        if(
$this->connection !== -1 ) {
           
           
$memcache_server = explode(":", $config['memcache_server']);
           
$this->connection = 1;
           
            if (
$memcache_server[0] == 'unix') {
               
               
$memcache_server = array($config['memcache_server'], 0);
               
$this->host = $memcache_server[0];
               
$this->port = -1;
               
            } else {
               
$this->host = $memcache_server[0];
               
$this->port = $memcache_server[1];
            }
           
            if ( !
$this->server->addServer($memcache_server[0], $memcache_server[1]) ) {
               
$this->connection = 0;
            }
           
            if (
$this->server->getStats() === false ) {
               
$this->connection = 0;
            }
           
            if(
$this->connection > 0 AND $this->server_type == "memcached") {
               
               
$this->server->setOption(Memcached::OPT_COMPRESSION, false);
               
            }
        }
       
        if (
$config['clear_cache'] ) $this->max_age = $config['clear_cache'] * 60; else $this->max_age = 86400;

    }
   
    protected function
connect() {
       
        if(
class_exists( 'Memcached' ) ) {
           
           
$this->server_type = "memcached";
           
            return new
Memcached();
       
        } elseif(
class_exists( 'Memcache' ) ) {
           
           
$this->server_type = "memcache";
           
            return new
Memcache();

        } else {
           
           
$this->connection = -1;
           
        }
       
    }
   
    public function
get( $key ) {
       
        if(
$this->connection < 1 ) return false;

        return
$this->server->get($key."_".$this->suite_key);
       
    }

    public function
set($key, $value) {
       
        if(
$this->connection < 1 ) return false;

       
$this->_set( $key."_".$this->suite_key, $value );
       
        return
true;
       
    }
   
    public function
clear( $cache_areas = false ) {
       
        if(
$this->connection < 1 ) return false;
       
        if (
$cache_areas ) {
            if(!
is_array($cache_areas)) {
               
$cache_areas = array($cache_areas);
            }
        }
       
        if(
$cache_areas ) {
           
           
$all_list = $this->getAllKeys();

            if(
count($all_list)) {
       
                foreach (
$all_list as $key ) {
                   
                    foreach(
$cache_areas as $cache_area){
                       
                        if(
stripos( $key, $cache_area ) === 0 ) {
                           
$this->server->delete($key);
                        }
                   
                    }
                }
               
            } else {
               
               
$this->_clear_all();
               
            }
           
        } else {
           
           
$this->_clear_all();
           
        }
       
        return
true;
       
    }
   
    protected function
_set( $key, $value) {
       
        if(
$this->connection < 1 ) return false;

        if (
$this->server_type == "memcache" ) {
           
           
$this->server->set( $key, $value, null, $this->max_age );
           
        } else {
           
           
$this->server->set( $key, $value, $this->max_age);
           
        }
       
        return
true;
    }

    protected function
getAllKeys() {

        if(
method_exists( $this->server, 'getAllKeys' ) ) {

           
$allKeys = $this->server->getAllKeys();
            return
$allKeys;
           
        }

       
$sock = fsockopen($this->host, $this->port);
       
        if (
$sock === false) {
            return array();
        }
   
        if (
fwrite($sock, "stats items\n") === false) {
            return array();
        }
   
       
$slabCounts = $allKeys = array();
       
        while ((
$line = fgets($sock)) !== false) {
           
$line = trim($line);
            if (
$line === 'END') {
                break;
            }
   
            if (
preg_match('!^STAT items:(\d+):number (\d+)$!', $line, $matches)) {
               
$slabCounts[$matches[1]] = (int)$matches[2];
            }
        }
   
        foreach (
$slabCounts as $slabNr => $slabCount) {
            if (
fwrite($sock, "lru_crawler metadump {$slabNr}\n") === false) {
                return array();
            }
   
           
$count = 0;
            while ((
$line = fgets($sock)) !== false) {
               
$line = trim($line);
                if (
$line === 'END') {
                    break;
                }
   
                if (
preg_match('!^key=(\S+)!', $line, $matches)) {
                   
                    if(
strpos( $matches[1], $this->suite_key ) !== false ) {
                       
                       
$allKeys[] = $matches[1];
                       
$count++;
                   
                    }
                }
            }
        }
   
       
fclose($sock);
       
        return
$allKeys;
       
    }
   
    protected function
_clear_all() {
       
        if(
$this->connection < 1 ) return false;
       
       
$this->server->flush();
       
        return
true;
       
    }
   
    public function
__destruct() {
       
        if(
$this->connection < 1 ) return;
       
        if(
$this->server ) {
            if(
method_exists( $this->server, 'quit' ) ) {
               
$this->server->quit();
            } elseif(
method_exists( $this->server, 'close' ) ) {
               
$this->server->close();
            }
        }
    }
   
}


// deprecated name

class dle_memcache
{
    public
$connection = null;
   
    public function
__construct( $config ) {
       
$this->connection = 0;
    }
   
}

?>