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では、Concrete5が静的プロパティを作成する場合、__constructで一度作成するようです。

私の質問は、最善の解決策は何ですか?

4

1 に答える 1

1

getInstance()メソッドは、App_Cache ではなく Zend_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 インスタンスを 1 回だけ作成し、それを App_Cache オブジェクトの$_instance変数に保存します。

わかりました、Zend_Cache オブジェクトの静的インスタンスを保持し、要求があればそれを返すようにコードを変更しました。これにより、インスタンスが 1 回だけ作成されます。メソッド名を getCache() などに変更して、何をしているのかを明確にする必要があると思います。

于 2012-12-10T17:37:04.627 に答える