哪里可以在php mvc中实例化新的Memcache

时间:2012-02-08 22:53:39

标签: php model-view-controller pdo memcached

我正在尝试让我的缓存正常工作,这样每次我想在模型函数中缓存查询时都不需要创建一个新的memcache实例:

class contentModel {

    function getData() {

        $core = Connect::getInstance();

        $memcache = new Memcache;
        $memcache->connect('localhost', 11211) or die ("Could not connect");

        $data = $memcache->get("query".$sql);

        if($!data)
            // get data

        return $data;
    }
}

如果在我的root index.php中,我添加:

global $memcache;
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

那么我是否可以在所有课程中调用$memcache->get($key)而无需重新实例化?

或者我还有其他方法可以简化这个吗?

3 个答案:

答案 0 :(得分:2)

您可以使$memcached成为模型基类的静态成员,例如:

class Model {
    protected static $memcached;

    public static function setMemcached(Memcached $mc) {
        self::$memcached = $mc;
    }
}

class User extends Model {
    public function getData() {
        parent::$memcached->get("...");
    }
}

// In index.php
Model::setMemcached(new Memcached("127.0.0.1:11211"));

答案 1 :(得分:0)

在数据库/数据访问库中是否可以更好地实现缓存,然后可选地针对特定查询/数据请求调用缓存?这样,用于执行缓存的实际机制对模型来说是透明的。

您只需在数据库库中维护一个可以共享的实例。检查是否使用缓存会有性能损失,但与所有模型中复杂性的增加相比,它相对便宜。

答案 2 :(得分:0)

作为一般规则,您必须认为访问缓存数据(再次)访问数据,这是您的数据访问对象(或模型,或任何您想要它们)处理的责任。

因为,如果没有,你打算做什么?提供从视图访问memcached根本没有意义,控制器?控制器应该负责管理表单信息等,但由于控制器不能访问数据库,因此不应该访问memcached。

最后,如果你在models / daos上管理你的memcached,你有一个写入/读取memcached的单点,所以你可以安全地知道缓存信息总是反映数据库信息。对于开发人员来说,它也是完全透明的(在大中型团队中特别有用)。此外,通过集中(再次,模型/ dao)访问memcached的位置,您将避免使用不同的密钥存储相同的值,因此您将节省内存并且可以缓存更多信息。