2012-03-16 9 views
9

Mam pytanie dotyczące sposobu buforowania widoku i buforowania przeglądarki w CakePHP 2.1.CakePHP 2.1: Pamięć podręczna przeglądarki a widok podręczny

Właśnie zmodernizowane moim app CakePHP 2.1 i skonfigurować buforowanie HTTP przy użyciu nowej metody $this->response->modified (który działa dobrze):

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')); 
    } 
} 

Mam również skonfigurować CakePHP widok buforowanie:

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

Oba działają dobrze, gdy są używane niezależnie. Jednak gdy oba są włączone, buforowanie widoku CakePHP wydaje się nadpisywać buforowanie przeglądarki (konkretnie, nagłówek nie jest wysyłany, gdy strony są wyświetlane z bufora podręcznego widoku CakePHP). Dzięki temu przeglądarka nie buforuje stron, które są wyświetlane z bufora podręcznego CakePHP.

Idealnie chciałabym przeglądarkę do stron pamięci podręcznej, nawet jeśli są one podawane z pamięci podręcznej CakePHP (tj Chciałbym CakePHP zwrócić Last-Modified nagłówek, a odpowiedzi na If-Modified-Since nagłówka żądania przeglądarki, niezależnie od tego, czy CakePHP ma się zwrócenie kopii strony z pamięci podręcznej lub nie).

Zastanawiam się, czy to jest oczekiwane zachowanie, czy robię coś złego, czy jest to coś, co nie zostało uwzględnione (lub nie jest uważane za ważne).

Odpowiedz

2

Widok buforowania z natury rzeczy nie wykonuje metody kontrolera na każde żądanie. Zgaduję, że wykonuje działanie raz, a następnie buforuje dane wyjściowe na dysk (lub dowolny silnik pamięci podręcznej, którego używasz). Jeśli masz look at the CacheHelper's _writeFile method, możesz zobaczyć, jak zbudowany jest widok w pamięci podręcznej.

$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); 
    ?>'; 

Tworzy nową Controller obiektu (z nowym CakeResponse) i ładuje wszystkie pomocników, wtyczki, itp, które mogą być używane w widoku i zapisuje je do pamięci podręcznej.

Wygląda na to, że dodanie nagłówka Last-Modified do odpowiedzi akcji/widoku w pamięci podręcznej może wymagać pewnych głębokich modyfikacji w podstawowej bibliotece CakePHP.

+1

Tak, wszelkie modyfikacje obiektu Response wykonane przez działanie kontrolera nie będą buforowane, dotyczy to również ustawień nagłówków kontroli pamięci podręcznej. Istnieje otwarty bilet na ten temat (ale nie związany z buforowaniem): http://cakephp.lighthouseapp.com/projects/42648/tickets/2358-cachehelper-defect-with-response Jedynym zalecanym rozwiązaniem jest ręczne ustawienie nagłówków w obu układ lub 'Controller :: beforeFilter()' (z włączoną funkcją zwrotną). – pixelistik

Powiązane problemy