Zend_Cache tanımlayıcı nasıl kullanılır?

4 Cevap php

bence iam deli oluyor, iam benim veritabanı sorgu önbelleğe Zend_Cache uygulamaya çalışıyor. Ben nasıl çalıştığını bilmek ve nasıl yapılandırılacağı.

Ama önbellek entrys için tanımlayıcı ayarlamak için iyi bir yol bulamıyorum. Ben (arama değerleri ile bir dizi dayalı) benim veritabanında kayıtları için bir yöntem wich arama var.

/**
 * Find Record(s)
 * Returns one record, or array with objects
 *
 * @param array   $search Search columns => value
 * @param integer $limit  Limit results
 * @return array One record , or array with objects
 */
public function find(array $search, $limit = null)
{
    $identifier = 'NoIdea';

    if (!($data = $this->_cache->load($identifier))) {
        // fetch
        // save to cache with $identifier..
    }

Ama tanımlayıcı ne tür bu durumda kullanabilir miyim?

4 Cevap

Tanımlayıcı önbellek girdisini temsil etmek için benzersiz bir dize olmalıdır.

Eğer veritabanı tabloları ve örneğin alanlara göre onları isim isteyebilirsiniz db_tablename_primarykey_1

Birkaç argümanlar ile bir yöntemi varsa, hepsini içeren bir dize yapmak için bir ağrı olacak. Alternatif bir işlevin argümanlar ve karma bir dize üretmek için db_tablename CONCAT edebilirsiniz. Örneğin:

$identifier = md5('db_tablename_find' . serialize(func_get_args()));

Eğer böyle bir şey yapabilirsiniz Zend Cache, için Function frontend kullanarak düşünebilirsiniz:

$cache->call('veryExpensiveFunc', $params);

ve anahtar (gerçi, uzun ish biri olabilir) otomatik olarak üretilen olacaktır. Eğer şeffaf, sınıfının tüm yöntemleri önbelleğe sağlayacak Sınıf frontend'i kullanabilirsiniz.

Ben bu aynı sorunu yaşıyorum. Eğer henüz bir çözüm bulunamadı eğer ben bilmiyorum ama (çok verimli değil çünkü) ben geçici bir çözüm var:

  1. Her sorgulamak için gidiyoruz masa ve önbellek sonuçlar için bir önbellek dizini oluşturun.

  2. O tabloyu sorgulamak zaman, benzersiz bir kimliği kullanarak sonucu kaydedin. İşte benim çözüm ile sorun. Çok uzun olabilir beri bir id olarak sorgu kullanamazsınız ve bazı işletim sistemleri reddedebilir. Peki ben ile geldi, bu gibi otomatik artan id ile birlikte başka bir dosyadaki tüm sorguları saklamak için:

    0->>SELECT * FROM table
    1->>SELECT * FROM table WHERE foo = bar
    

Siz anladınız. Yani sorguyu çalıştırmadan önce varsa, bu kimliği kullanarak kimliği ve yük almak, geçerli sorgu olup olmadığını görmek için bu dosyayı kontrol edin. Sen aynı önbellek dizininde bu dosyayı saklayabilirsiniz.

  1. Güncelleştirmek zaman, sadece bu gibi önbelleğe kayıtlarını temizlemenizi tabloya veri eklemek veya silmek: $ cache-> temiz ('all'). Aynı sorguları çalıştırmak olacaktır beri id dosyasını silmeniz gerekmez. Ve eğer merak ediyorsanız, bu dizinde o olacak, sadece temiz önbellek dosyaları, her tablo için bir dizin dolayısıyla ihtiyaç.

Iyi. Hatta bir ömür boyu ayarlanır (onlar sonsuza kadar var olabilir) veya u bir güncelleştirme çalıştırmak zaman, kendiniz temizlemek eklemek veya silmek beri ur önbellek için autoClean zorunda değilsiniz.

Çirkin. Herhangi bir test, yük veya kaydetmek iki (ya da üç, biz yeni bir sorgu için yeni bir kimliği kaydetmek gerekir) dosya sistemi istekleri yapacaktır.

Ben bu kullandım ve Zend_Cache_Core ve Zend_Cache_Backend_File kullanarak çalışıyor. Ben tam bir çerçeve kullanarak değilim, ama sen bütün çerçevesini kullanmak eğer dizinleri, id dosyalar oluşturmayı yapıyor olacak bir soyut model sınıf oluşturmak gerekir, ve modeli çocuk sınıflar için önbelleğe alma böylece ben Zend_Cache modülünü kullanabilirsiniz (ki o zaman uzatacaktır).

Ben md5 kullanarak her tablo için bir id nin dosyası oluşturmak zorunda bir çözüm olabilir burada gördüm. Ben bunu denemek ve size geri alırsınız. Ben, bu APC ile çalışmak nasıl bilmiyorum.

Zaman temel veri değişiklikleri ne olur? Peki, tüm uygulanabilir önbellek kayıtları hurdaya edilmelidir. Bu solucan bir mondo bidonum!

Nasıl RDBMS'e bu verileri önbelleğe alma boşaltma hakkında?

Örneğin, MySQL Query Cache uygun olarak eskiyen önbellek kayıtları geçersiz, sizin için bu işler.