MVC için önbellek katman - Model veya denetleyici?

2 Cevap php

Ben önbelleğe alma kısmını uygulamak için nereye hakkında bazı ikinci düşünceleri yaşıyorum. Bunu uygulamak için en uygun yer neresidir, sizce?

Her model içinde, ya da denetleyicisi?

Approach 1 (psuedo-code):

// mycontroller.php

MyController extends Controller_class {
   function index () {
        $data = $this->model->getData();
        echo $data;
   }
}

// myModel.php

MyModel extends Model_Class{
    function getData() {

        $data = memcached->get('data');

        if (!$data) {
            $query->SQL_QUERY("Do query!");
        }

        return $data;
    }  
}

Yaklaşım 2:

// mycontroller.php

MyController extends Controller_class {
   function index () {
        $dataArray = $this->memcached->getMulti('data','data2');

        foreach ($dataArray as $key) {
            if (!$key) {
                $data = $this->model->getData();
                $this->memcached->set($key, $data);
            }
        }

        echo $data;
   }
}

// myModel.php

MyModel extends Model_Class{
    function getData() {           
        $query->SQL_QUERY("Do query!");

        return $data;
    }  
}

Düşünceler:

Yaklaşım 1:

  • Hayır MultiGet / multi-set. Tuşları yüksek sayıda iade edilecek olursa, havai neden olacaktır.

  • Bakımı kolay, tüm veritabanı / önbellek kullanımı her modelde olduğu

Yaklaşım 2:

  • Daha performancewise - multiset / MultiGet kullanılır

  • Gerekli fazla kod

  • Korumak için daha zor

Ne düşündüğünü söyle!

2 Cevap

Ben genel seçim olsaydı Caching should be done in the model., muhtemelen şeffaf kodunuzu kalanı için herhangi bir değişiklik yapmanızı gerektirir olmaz modelin veritabanı etkileşimi, önbelleğe sona erecekti. Bu elbette sizin modellerinin üst sınıf bitmiş olacaktır.

Kesinlikle en havai göreceksiniz nerede veritabanı ile arabirim olduğu gibi, veritabanı sorgu sonuçlarını önbelleğe alma odaklanır. Ben (ya da belki tüm başlatıldı modeli) veritabanı sonuçları şeyden daha fazla önbelleğe daha verimli olacağını iddia ediyorum.

Bunu memcache içine karmaşık türleri (diziler veya nesneler) göndermeden, önbelleğe alma önce nesneleri seri bir sorun olmaması gerektiğini unutmayın. PHP 5 seralizing ve tefrika nesneleri yeniden çok amaçlı sihirli yöntemler __sleep() ve __wakeup() sağlar. PHP tam nesneleri önbelleğe temelde pasta bir parçasıdır. http://php.net/manual/en/language.oop5.magic.php daha fazla bilgi için bkz.

Sadece veri veya başlatma size kalmış kısa bir süre sonra tüm model önbelleğe karar olsun.

Ben sıkıca modeli içinde benim önbelleğe alma sorumlulukları devam edecek. Bu denetleyici ya da görünümün iş where model verileri oluyor ilgilendirmez. Onlar umurumda tüm bilgiler istendiğinde, veri sağlanır olmasıdır - bu MVC paradigma çalışmak gerekiyordu nasıl.

Üst modeli sınıfa Özet mem_cache işlevsellik. Bu, (kod = zaman = para) yazmak sisteme değişiklikler basitleştirmek, ve inşa size model başına üretmek hataların sayısını ortadan kaldırmak (önceki formülünü görmek) için gereken kod miktarını azaltmak olacaktır.

Standardize, standardize.