Zend_Navigation önbelleğe alma

3 Cevap php

Ben Zend_Cache kullanarak önbelleğe zaman Zend_Navigation şifreli alma sayfa hiyerarşisi ile sorun yaşıyorum.

Arka plan: Ben yaklaşık 50 sayfa ve bir veritabanında saklanan yaklaşık 300 ürün bulunmaktadır. Ben veritabanını sorgulamak ve Zend_Navigation beslemek için bir dizi oluşturmak.

Önbellek

        $secondsBetweenRefreshes = APPLICATION_ENV == 'development' ? 30 : 300; 
        self::$cache = Zend_Cache::factory( 'Core', 'File',
                             array( 'automatic_serialization' => true,
                                    'lifetime' => $secondsBetweenRefreshes ),
                             array( 'cache_dir' => CACHE_PATH . 'nav/' )
                           );

Bu çalışıyor

    $struct = $cache->load('Zend_Navigation'); 
    if (empty($struct))
    {
        $cache->save($struct = self::getSiteStructure() );
    }
    return new Zend_Navigation( $struct );

Bu karıştırılmış olur

    $struct = $cache->load('Zend_Navigation'); 
    if (empty($struct))
    {
        $cache->save($struct = new Zend_Navigation( self::getSiteStructure() );
    }
    return $struct;

Bu önbellekten çekilir değilse navigasyon çalışıyor. Evet, bariz çözüm Zend_Navigation önbelleğe değil, yapıcı iç temsilini oluşturmak için bir sürü iş yapar: kadar ben gibi pre-bilgisayarlı ile önbelleğe alma yapmak mantıklı ...

Ben hala şifreli sonuçlarında bir desen olup olmadığını görmek için çalışıyorum. Ağaçta herhangi bir ilmik / çevrimi vardır.

3 Cevap

Bu soruyu okuduktan sonra, ben Zend_Navigation kodu hızlı bir bakış aldı ve serileştirme kullanarak önbelleğe alma ile herhangi bir içsel sorunları olması gerektiğini görünmüyor. Ancak ben aşağıdaki bulundu Zend_Navigation belgelerine bakarak:

The toArray() method converts the container and the pages in it to an array. This can be useful for serializing and debugging. - Zend Navigation Containers: Other

Sen dizi oluşturmak ve bu önbelleğe toArray () işlevini kullanın, Zend_Navigation nesne oluşturmak isteyebilirsiniz. Eğer bazı testler yapmak isteyebilirsiniz ancak yeniden oluşturarak bir diziden sayfaları, oldukça ucuz olmalıdır.

Mümkünse eğer ona bir göz atın böylece Ayrıca, Zend Framework bakımcılara ile bir hata rapor.

Zend_Navigation ilginç bir bileşen olmasına rağmen, ve belki faydalı bir şey ki çok kullanmak değil. Büyük web siteleri bellekte 10.000 + nesneler olması için akıllı bir fikir değildir, ve bazı öğeler uygulanan yol Zend_Navigation yavaş ve hantal yapar. Zend Framework kullanarak pek çok geliştirici aynı hedeflere ulaşmanın başka yollarını buldular.

Yazı için teşekkürler; Ben Zend_Navigation ve Zend_Cache birleştirerek sorunları olabilir düşündüm, ama ben normal bir Zend_Navigation nesne üzerinde save yöntemini kullanın ve sonra herhangi olmadan geri önbellekten nesne almak mümkün oldum kullanmanız gerekir toArray().

X-Istence: Ben nesneleri büyümek navigasyon boyutu olarak, oldukça unwieldly hale olabilir katılıyorum; Ben boyutu devrilme noktası olarak benim anlayış tamamlamak için kod derin kazmak gerekir olsa.

Sadece bir sayfa dizi önbelleğe alma hakkında uyarı ...

Eğer toArray() adlı dizi önbelleğe ve sadece kullanmak istiyorsanız setPages($pagesFromCache), gelecekte kullanmak için önbelleğe dizideki tüm sayfaları deactive gerekir.

Dikkatli olun, Zend_Navigation_Page_Mvc::isActive() geçerli istek denetler. Bu setActive(false) denilen bile, isActive() mevcut MVC sayfasında still return true anlamına gelir.

Ben tüm sayfaları kapatmak için bulunan tek yolu özyinelemeli çıkan dizi yalak yürümek için:

$pages = $navigation->toArray();

array_walk_recursive(
    $pages,
    function(&$item, $key)
    {
        if($key === 'active')
            $item = false;
    }
);

$cache->save($pages, 'pages');