在phpmvc中实例化新Memcache的位置


Where to instantiate new Memcache in a php mvc

我正在努力使缓存正常工作,这样我就不需要每次在模型函数中缓存查询时都创建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;
    }
}

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

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

那么,我是否可以在所有类中调用$memcache->get($key),而不必重新实例化它?

或者还有其他方法可以简化它吗?

您可以使$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"));

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

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

通常,您必须认为访问缓存数据就是(再次)访问数据,这是由您的数据访问对象(或模型,或您想称之为它们的任何对象)处理的责任。

因为,如果没有,你打算怎么办?从视图提供对memcached的访问毫无意义,控制器呢?控制器应该负责管理表单信息等等,但由于控制器不能访问数据库,因此也不应该访问memcached。

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