Класс для memcache и функция для повторного использования одного и того же объекта

Я установил расширение memcache (без D) для PHP. Это функция, которую я использую для создания объекта memcache только один раз, а затем повторно его использую.

# Memcache handler
class mem {
    var $id;
    var $expire;
    public static $mem;

    # Constructor
    function __construct($unique) {
        # ID
        $this->id = md5($unique);

        # Item expiration
        $this->expire = 86400;

        # Create or reuse object
        if(!isset(self::$mem)) {
            # Create new connection
            self::$mem = new Memcache;
            self::$mem->addServer('localhost', 11211);
        }
    }

    # Get
    public static function get() {
        # Check if object is cached
        if($data = self::$mem->get($this->id)) {
            # ID is cached
            return $data;
        } else {
            # ID is not cached
            return false;
        }
    }

    # Set
    public static function set($id, $data, $replace=false) {
        if(self::$mem->add($this->id, $data, MEMCACHE_COMPRESSED, $this->expire)) {
            # Write to memory
            return true;
        } elseif($replace) {
            # Replace information
            self::$mem->replace($this->id, $merge, MEMCACHE_COMPRESSED, $this->expire);
            return true;
        } else {
            # Return nothing
            return false;
        }
    }

    # Delete key
    public static function delete() {
        if(self::$mem->delete($this->id)) {
            return true;
        } else {
            return false;
        }
    }
}

Примеры использования

Пользователь записывает данные в память:

mem::set('some_clever_ID', array('this','and','that'));

Пользователь получает данные из памяти:

$data = mem::get('some_clever_ID');

Пользователь печатает захваченные данные:

print_r($data); //should print an array with ['this', 'and', 'that']

Пользователь удаляет ключ из памяти:

mem::delete('some_clever_ID');

У меня есть 2 вопроса:

  1. Почему я получаю эту ошибку? Неустранимая ошибка: вызов функции-члена add() для необъекта в /inc/memcache.php

  2. Интересно, будет ли какой-либо способ улучшить производительность этого кода или мне следует реализовать другой подход. Идея состоит в том, чтобы быстро управлять значениями memcache и по возможности повторно использовать соединение memcache.

Любая помощь и комментарии будут высоко оценены.

Обновление: решение

Я закончил тем, что поместил функцию memcache вне класса.

# Memcache settings
$config['memcache']['servers'][] = array('localhost',11211);
$config['memcache']['debug'] = true;

# Create memcached object
function cache() {
    global $config;
    static $cache;
    if(!isset($cache)) {
        $cache = new Memcache;
        foreach($config['memcache']['servers'] as $server) {
            $cache->addServer($server[0], $server[1]);
        }
    }
    return $cache;
}

# Memcache handler
class mem {
    var $id;
    var $expire;

    # Constructor
    function __construct($unique) {
        global $config;

        # ID
        $this->id = md5(PRO_NAME.'_'.$unique);

        # Item expiration
        if($config['memcache']['debug']) {
            $this->expire = 5;
        } else {
            $this->expire = 86400;
        }
    }

    # Get
    function get() {
        # Check if object is cached
        if($data = cache()->get($this->id)) {
            # ID is cached
            return $data;
        } else {
            # ID is not cached
            return false;
        }
    }

    # Set
    function set($data, $replace=false) {
        if(cache()->add($this->id, $data, MEMCACHE_COMPRESSED, $this->expire)) {
            # Write to memory
            return true;
        } elseif($replace) {
            # Replace information
            if(cache()->replace($this->id, $data, MEMCACHE_COMPRESSED, $this->expire)) {
                return true;
            } else {
                return false;
            }
        } else {
            # Return nothing
            return false;
        }
    }

    # Delete key
    function delete() {
        if(cache()->delete($this->id)) {
            return true;
        } else {
            return false;
        }
    }
}

Напиши пример

$obj = new mem('clever_ID_here');
$obj->set('some data');
//or use $obj->set('some data', true); if you want to replace previous value

Возьмите пример

$obj = new mem('clever_ID_here');
echo $obj->get();

Удалить пример

$obj = new mem('clever_ID_here');
$obj->delete(); //if you wish to delete the key

2 ответа

В функциях вашего класса, вы должны сделать $this->mem вместо $mem,

Я предлагаю вам проверить этот класс: PHPFastCache, который очень прост и позволяет вам использовать не только Memcache(d), но и другие системы кэширования, не меняя ничего в вашем коде.

$mem - это статическое свойство в вашем классе, поэтому вместо доступа к нему $mem

ты должен использовать self::$mem;

С точки зрения дизайна класса, вы не должны использовать global в конструкторе для класса, вместо этого вы должны передать ссылку на объект config в класс. Например:

 function __construct($unique, $config) {

Поскольку все методы вызываются статически, есть большая вероятность, что конструктор никогда не будет вызван.

Чтобы обойти это, вы можете создать защищенный статический метод, который предоставит вам экземпляр memcached

protected static function getMemcache() {

    # Create or reuse object
    if(!isset(self::$mem)) {
        # Create new connection
        self::$mem = new Memcache();
        self::$mem->addServer('localhost', 11211);
    }
    return self::$mem;
}

Везде, где у вас есть доступ self::$mem замените его на self::getMemcache()

Другие вопросы по тегам