0

在我们的应用程序中,我们有一些与此非常相似的东西:

$cache  = App_Cache::getInstance()->newObject(300);
$sig = App_Cache::getCacheName(sha1($sql));
$res = $cache->load($sig);
if ($res === false) {
    $res = $db->fetchAll($sql);
    $cache->save($res, $sig);
}

目前的问题是我们最终每次都会创建一个 Zend_Cache 的新对象,并且对于每个请求,这最终可能会被调用 300 多次。

class App_Cache {

    protected static $_instance = null;
    public static $enabled = true;
    protected $frontend = null;
    protected $backend = null;
    protected $lifetime = null;

    public function __construct() { }

    public static function getInstance() {
        if (is_null(self::$_instance))
            self::$_instance = new self();
        return self::$_instance;
    }

    public function newObject($lifetime = 0) {
        return Zend_Cache::factory('Core','Memcached',$this->getFrontend($lifetime),$this->getBackend());
    }

    public static function getCacheName($suffix) {
        $suffix = str_replace(array("-","'","@",":"), "_",$suffix);
        return "x{$suffix}";
    }

Magento中,他们似乎在 __construct 中创建了一次,其中 Concrete5 创建了一个静态属性。

我的问题是最好的解决方案是什么?

4

1 回答 1

1

我认为您的getInstance()方法应该返回您的 Zend_Cache 实例而不是 App_Cache。尝试这样的事情:

class App_Cache 
{
  protected static $_instance = null;
  protected static $_cacheInstance = null;
  public static $enabled = true;
  protected $frontend = null;
  protected $backend = null;
  protected $lifetime = null;

  public function __construct() { }

  public static function getInstance() {
    if (is_null(self::$_instance))
        self::$_instance = new self();
    return self::$_instance;
  }

  public function newObject($lifetime = 0) {
    if (is_null(self::$_cacheInstance))
      self::$_cacheInstance = Zend_Cache::factory('Core','Memcached',$this->getFrontend($lifetime),$this->getBackend());
    return self::$_cacheInstance;
  }

  public static function getCacheName($suffix) {
    $suffix = str_replace(array("-","'","@",":"), "_",$suffix);
    return "x{$suffix}";
  }
}

请注意,我将newObject()方法更改为静态并将其参数添加到getInstance(). 这样,您可以getInstance()在整个代码中调用,它只会创建一次 Zend_Cache 实例,然后将其保存在 App_Cache 对象的$_instance变量中。

好的,更改代码以保存 Zend_Cache 对象的静态实例并在请求时返回它。这只会创建一次实例。我认为应该将方法名称更改为 getCache() 或类似的名称,以便更清楚它在做什么。

于 2012-12-10T17:37:04.627 回答