Класс для 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 вопроса:
Почему я получаю эту ошибку? Неустранимая ошибка: вызов функции-члена add() для необъекта в /inc/memcache.php
Интересно, будет ли какой-либо способ улучшить производительность этого кода или мне следует реализовать другой подход. Идея состоит в том, чтобы быстро управлять значениями 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()