ZF2

2012-12-07 12 views
6

में कैशिंग से कैसे संपर्क करें मैं पूरी तरह से कैशिंग में अपना सिर प्राप्त करना शुरू कर रहा हूं। मेरे पास एक साधारण अनुक्रमणिका एक्शन() है जो सभी दिए गए डेटासेट प्राप्त करता है। मेरे दृष्टिकोण है:ZF2

  • मौजूदा कुंजी 'controllername सूचकांक सूचकांक'
  • के लिए चेक मौजूदा: के प्रमुख
  • अगर नहीं मौजूदा, सामान्य कार्रवाई कर मान और कुंजी जोड़ने

कुंजी के अंदर मान ViewModel होना चाहिए जो मेरे डेटा के साथ उत्पन्न और पॉप्युलेट किया जाएगा।

यहाँ मैं अब तक क्या किया है है:

<?php 
public function indexAction() 
{ 
    $sl = $this->getServiceLocator(); 
// $cache = $sl->get('cache'); 
// $key = 'kennzahlen-index-index'; 
// 
// if ($cache->hasItem($key)) { 
//  return $cache->getItem($key); 
// } 

    $viewModel = new ViewModel(); 
    $viewModel->setTemplate('kennzahlen/index/index'); 
    $entityService = $sl->get('kennzahlen_referenzwert_service'); 
    $viewModel->setVariable('entities', $entityService->findAll()); 

// $cache->setItem($key, $viewModel); 

    return $viewModel; 
} 

कैशिंग भागों परीक्षण प्रयोजनों के लिए बाहर टिप्पणी की हैं, लेकिन मूल रूप से यह सब है कि मैं कर रहा हूँ है। कैशिंग config/सेवा ऐसा दिखाई देता है:

<?php 
'cache' => function() { 
    return \Zend\Cache\StorageFactory::factory(array(
     'adapter' => array(
      'name' => 'filesystem', 
      'options' => array(
       'cache_dir' => __DIR__ . '/../../data/cache', 
       'ttl' => 100 
      ), 
     ), 
     'plugins' => array(
      array(
       'name' => 'serializer', 
       'options' => array(

       ) 
      ) 
     ) 
    )); 
}, 

क्रमबद्धता और कैशिंग काफी अच्छी तरह से काम करता है, लेकिन मैं लापता परिणामों से हैरान हूं। ZendDevelopersToolbar मुझे बताता है कि कैशिंग सीमा के बिना 1.8 से 2.5 के बीच के समय के बारे में बताते हैं। कैशिंग भागों को असम्बद्ध (सक्षम) होने से वास्तव में मेरे पृष्ठ के लोडिंग समय में वास्तव में सुधार नहीं होता है।

तो मेरा सवाल है: क्या यह दृष्टिकोण पूरी तरह से गलत है? क्या अलग-अलग, अधिक तेज़ भागों हैं, जिन्हें कुछ साफ विन्यास युक्तियों से बचाया जा सकता है?

मुझे लगता है कि एक पृष्ठ का 2 सेकंड लोड समय निश्चित रूप से धीमा है। मेरे लिए 1 एस अधिकतम डेटा की एक बड़ी मात्रा है, लेकिन निश्चित रूप से उससे अधिक कुछ नहीं: एस

सभी सहायता/संकेत/सुझावों की बहुत सराहना की जाएगी। अग्रिम में धन्यवाद!

+0

आप इस विशिष्ट भाग आप इस परेशानी हो रही खड़ी कर रहा है यकीन है: मैं अपने ऐप्लिकेशन में इस सूखी उपयोग करने के लिए एक छोटे से मॉड्यूल लिखा? मेरे ZF2 पृष्ठ आमतौर पर 100ms से कम होते हैं, इसलिए इसके लिए एक और कारण होना चाहिए। इसके अलावा मैं विशिष्ट क्वेरी परिणामों को कैश करना पसंद करूंगा, मॉडल नहीं देख सकता। यदि आप संबंधित दृश्य को कैश करना चाहते हैं, तो दृश्य प्रतिपादन कैश करें ताकि आप .phtml फ़ाइलों के पार्सिंग को भी छोड़ सकें। अन्यथा, सेवा के परिणाम कैश करें। –

+0

सवाल यह होगा कि कोड को इंजेक्ट करने के लिए, इसलिए मैं पहले से ही दृश्य प्रतिपादन कैश कर सकता हूं? हालांकि स्पष्ट रूप से मुझे यह समझने का सुझाव दिया जाएगा कि मेरी स्क्रिप्ट इतनी धीमी गति से क्या कर रही है। वास्तव में कई मॉड्यूल सक्षम नहीं हैं, zfcuser, bjyauthorize, zenddeveloperstoolbar और सिद्धांत-सामान + मेरा मॉड्यूल जो कुछ डीबी इकाइयों को प्राप्त करने के लिए सिद्धांत का उपयोग करता है: S – Sam

+0

मैंने एक संभावित कैश विकल्प का उत्तर दिया जहां आपका HTML परिणाम कैश किया गया है। Xdebug इंस्टॉल करें और यह देखने के लिए कुछ प्रोफाइलिंग क्रियाएं करें कि आपके आवेदन की असली बाधा क्या है। –

उत्तर

17

एक विकल्प आपके पृष्ठ के पूर्ण आउटपुट को कैश करना होगा, उदाहरण के लिए मार्ग मिलान के आधार पर। घटना प्रस्तुत करना पर

namespace MyModule; 

use Zend\Mvc\MvcEvent; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     // A list of routes to be cached 
     $routes = array('foo/bar', 'foo/baz'); 

     $app = $e->getApplication(); 
     $em = $app->getEventManager(); 
     $sm = $app->getServiceManager(); 

     $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($sm) { 
      $route = $e->getRouteMatch()->getMatchedRouteName(); 
      $cache = $sm->get('cache-service'); 
      $key = 'route-cache-' . $route; 

      if ($cache->hasItem($key)) { 
       // Handle response 
       $content = $cache->getItem($key); 

       $response = $e->getResponse(); 
       $response->setContent($content); 

       return $response; 
      } 
     }, -1000); // Low, then routing has happened 

     $em->attach(MvcEvent::EVENT_RENDER, function($e) use ($sm, $routes) { 
      $route = $e->getRouteMatch()->getMatchedRouteName(); 
      if (!in_array($route, $routes)) { 
       return; 
      } 

      $response = $e->getResponse(); 
      $content = $response->getContent(); 

      $cache = $sm->get('cache-service'); 
      $key = 'route-cache-' . $route; 
      $cache->setItem($key, $content); 
     }, -1000); // Late, then rendering has happened 
    } 
} 

दूसरा श्रोता चेकों: आप मार्ग और भेजने जो मार्ग मैच के रूप में पाया गया है और फिर उसके अनुसार कार्य के बीच सुनने की जरूरत है। यदि ऐसा होता है, तो प्रतिक्रिया का परिणाम कैश किया जाएगा।

इस प्रणाली (शायद नहीं के साथ 100% कॉपी/पेस्ट, लेकिन अवधारणा) काम करता है क्योंकि, आवेदन करेंगे शॉर्ट सर्किट आवेदन प्रवाह और यदि आप मार्ग या प्रेषण घटना के दौरान एक Response लौट आगे ट्रिगर श्रोताओं बंद करो। इसके बाद यह इस प्रतिक्रिया को पूरा करेगा।

ध्यान रखें कि यह पूरा पृष्ठ (लेआउट समेत) होगा। यदि आप नहीं चाहते हैं (केवल नियंत्रक), तर्क को नियंत्रक में ले जाएं। पहला कार्यक्रम (अब मार्ग) नियंत्रक का प्रेषण होगा। उस जल्दी सुनें, इसलिए कार्रवाई का सामान्य निष्पादन छोड़ा जाएगा। परिणाम कैश करने के लिए, दृश्य परत को सुनने के लिए रेंडर ईवेंट की जांच करें।

/अद्यतन: SlmCache

+0

इन उदाहरणों के लिए धन्यवाद। XDebug वास्तव में करने के लिए अगली बात होगी। हालांकि यह उदाहरण - मेरे लिए - EventManager उपयोग के लिए एक अच्छा संदर्भ के रूप में कार्य करता है, जो कुछ है जिसे मैंने अभी तक नहीं समझा है :) इसके लिए धन्यवाद, सोमवार को प्रवीणता की रिपोर्ट करेगा;) – Sam

+0

मैं इस जवाब को स्वीकार करूंगा, क्योंकि यह सामान्य उद्देश्य है। मेरी त्रुटि हालांकि, कुछ xdebugging के बाद, मेरा डीबी कनेक्शन प्रतीत होता है, जो स्थानीय xampp पर्यावरण पर 1s लेता है, इसलिए किसी भी तरह से यह पता लगाना चाहिए;) आपकी मदद के लिए धन्यवाद! – Sam

+0

मुझे लगता है कि मैंने कहीं पढ़ा है कि चीजों को कैशिंग करने के लिए 'प्री' और' पोस्ट 'घटनाएं बहुत अच्छी हैं। कैश में जांचने के लिए पूर्व (फिर ऐसा करने पर लौट रहा है) और बूटस्ट्रैप/जो कुछ भी करने के बाद कैश में जोड़ने के लिए पोस्ट करें। –

संबंधित मुद्दे