用于重用相同对象的memcache和函数的类

时间:2013-06-10 16:59:40

标签: php class singleton memcached libmemcache

我为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');

我有两个问题:

  1. 为什么我收到此错误? 致命错误:在/inc/memcache.php中的非对象上调用成员函数add()

  2. 我想知道是否有任何方法可以改善此代码的性能,或者我是否应该实现不同的方法。我们的想法是快速管理memcache值并尽可能重用memcache连接。

  3. 任何帮助和评论都将受到高度赞赏。

    更新:解决方案

    我最终将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 个答案:

答案 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),还可以使用其他缓存系统,而无需更改代码中的任何内容。