我为PHP安装了memcache(没有D)扩展名。这是我用来创建一次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');
我有两个问题:
为什么我收到此错误? 致命错误:在/inc/memcache.php中的非对象上调用成员函数add()
我想知道是否有任何方法可以改善此代码的性能,或者我是否应该实现不同的方法。我们的想法是快速管理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
答案 0 :(得分:3)
$ 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()
答案 1 :(得分:3)
在班级的功能中,您必须$this->mem
而不是$mem
。
我建议你检查这个类:PHPFastCache,它非常简单,不仅可以使用Memcache(d),还可以使用其他缓存系统,而无需更改代码中的任何内容。