通过我们的应用程序,我们有一些非常相似的东西:
$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创建了一个静态属性。
我的问题是什么是最好的解决方案?
答案 0 :(得分: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()或类似的东西,以便它更清楚它正在做什么。