2012-03-16 28 views
9

मुझे केकपीएचपी 2.1 में कैशिंग और ब्राउज़र कैशिंग के साथ मिलकर काम करने के तरीके के बारे में एक सवाल है।केकपीएचपी 2.1: ब्राउज़र कैश बनाम देखें कैश

मैं सिर्फ CakePHP 2.1 करने के लिए अपने एप्लिकेशन अपग्रेड किया है, और नए $this->response->modified विधि (जो अच्छी तरह से काम करता है) का उपयोग कर HTTPS संचय की स्थापना:

class ArticlesController extends AppController { 
    public function view($id) { 
     $article = $this->Article->find(
      'first', 
      array('conditions' => array('Article.id' => $id)) 
     ); 

     $this->response->modified($article['Article']['modified']); 

     $this->set(compact('article')); 
    } 
} 

मैं भी CakePHP दृश्य कैशिंग की स्थापना की है:

class ArticlesController extends AppController { 
    public $cacheAction = array(
     'view' => array('callbacks' => true, 'duration' => "1 week"), 
    } 
} 

स्वतंत्र रूप से उपयोग किए जाने पर दोनों अच्छी तरह से काम करते हैं। हालांकि, जब दोनों सक्षम होते हैं, तो केकपीएचपी व्यू कैशिंग ब्राउज़र कैशिंग को ओवरराइड करना प्रतीत होता है (विशेष रूप से, Last-Modified हेडर भेजा जाता है जब केकपीएचपी व्यू कैश से पृष्ठों को परोसा जाता है)। यह ब्राउजर को कैशिंग पृष्ठों से रोकता है जो केकपीएचपी के व्यू कैश से परोसा जा रहा है।

आदर्श रूप में, मैं कैश पृष्ठों वे CakePHP के कैश से कार्य किया जा रहा है, भले ही करने के लिए ब्राउज़र चाहते हैं (यानी मैं CakePHP एक Last-Modified हैडर वापस जाने के लिए, और ब्राउज़र के If-Modified-Since अनुरोध हेडर का जवाब है, चाहे CakePHP है की परवाह किए बिना चाहते हैं पृष्ठ की कैश की गई प्रतिलिपि लौटाना या नहीं)।

मैं सोच रहा हूं कि यह व्यवहार की उम्मीद है या नहीं, चाहे मैं कुछ गलत कर रहा हूं, या फिर ऐसा कुछ है जिसे माना नहीं गया है (या यह महत्वपूर्ण नहीं माना जाता है)।

उत्तर

2

प्रकृति द्वारा कैशिंग देखें, वास्तव में प्रत्येक अनुरोध पर नियंत्रक की विधि निष्पादित नहीं करता है। मुझे लगता है कि यह एक बार कार्रवाई निष्पादित करता है और फिर आउटपुट को डिस्क पर कैश करता है (या, जो भी कैश इंजन आप उपयोग कर रहे हैं)। यदि आप look at the CacheHelper's _writeFile method, तो आप देख सकते हैं कि कैश किए गए दृश्य का निर्माण कैसे किया जाता है।

$file = '<!--cachetime:' . $cacheTime . '--><?php'; 

    if (empty($this->_View->plugin)) { 
     $file .= " 
     App::uses('{$this->_View->name}Controller', 'Controller'); 
     "; 
    } else { 
     $file .= " 
     App::uses('{$this->_View->plugin}AppController', '{$this->_View->plugin}.Controller'); 
     App::uses('{$this->_View->name}Controller', '{$this->_View->plugin}.Controller'); 
     "; 
    } 

    $file .= ' 
      $request = unserialize(\'' . str_replace("'", "\\'", serialize($this->request)) . '\'); 
      $response = new CakeResponse(array("charset" => Configure::read("App.encoding"))); 
      $controller = new ' . $this->_View->name . 'Controller($request, $response); 
      $controller->plugin = $this->plugin = \'' . $this->_View->plugin . '\'; 
      $controller->helpers = $this->helpers = unserialize(base64_decode(\'' . base64_encode(serialize($this->_View->helpers)) . '\')); 
      $controller->layout = $this->layout = \'' . $this->_View->layout . '\'; 
      $controller->theme = $this->theme = \'' . $this->_View->theme . '\'; 
      $controller->viewVars = unserialize(base64_decode(\'' . base64_encode(serialize($this->_View->viewVars)) . '\')); 
      Router::setRequestInfo($controller->request); 
      $this->request = $request;'; 

    if ($useCallbacks == true) { 
     $file .= ' 
      $controller->constructClasses(); 
      $controller->startupProcess();'; 
    } 

    $file .= ' 
      $this->viewVars = $controller->viewVars; 
      $this->loadHelpers(); 
      extract($this->viewVars, EXTR_SKIP); 
    ?>'; 

यह एक नया Controller वस्तु (एक नई CakeResponse के साथ) और भार सभी सहायकों, प्लग इन, आदि उस दृश्य में इस्तेमाल किया जा सकता है और यह कैश करने के लिए लिखते हैं पैदा करता है।

ऐसा प्रतीत होता है कि कैश एक्शन/व्यू के जवाब में Last-Modified शीर्षलेख जोड़ने के लिए कोर केकपीएचपी लाइब्रेरी में कुछ गहरी संशोधन की आवश्यकता हो सकती है।

+1

हां, नियंत्रक कार्रवाई द्वारा किए गए प्रतिक्रिया ऑब्जेक्ट में कोई भी संशोधन कैश नहीं किया जाएगा, इसमें कैश कंट्रोल हेडर की सेटिंग शामिल है। इसके बारे में एक खुला टिकट है (हालांकि कैशिंग से संबंधित नहीं): http://cakephp.lighthouseapp.com/projects/42648/tickets/2358-cachehelper-defect-with-response एकमात्र सुझाया गया वर्कअराउंड हेडर मैन्युअल रूप से मैन्युअल रूप से सेट कर रहा है लेआउट या 'कंट्रोलर :: पहले फ़िल्टर() '(कॉलबैक सक्षम के साथ)। – pixelistik

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