2012-03-16 46 views
9

Tôi có câu hỏi về cách xem bộ đệm ẩn và bộ nhớ đệm trình duyệt hoạt động cùng nhau trong CakePHP 2.1.CakePHP 2.1: Bộ nhớ cache của trình duyệt vs Xem bộ nhớ cache

Tôi vừa mới nâng cấp ứng dụng của tôi để CakePHP 2.1, và thiết lập HTTP bộ nhớ đệm bằng cách sử dụng $this->response->modified phương pháp mới (mà hoạt động tốt):

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

Tôi cũng đã thiết lập CakePHP xem bộ nhớ đệm:

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

Cả hai đều hoạt động tốt khi được sử dụng độc lập. Tuy nhiên, khi cả hai được bật, chế độ xem bộ đệm CakePHP dường như ghi đè bộ đệm ẩn của trình duyệt (cụ thể là không có tiêu đề Last-Modified được gửi khi các trang được phân phát từ bộ nhớ cache của khung nhìn CakePHP). Thao tác này sẽ dừng trình duyệt khỏi các trang đệm đang được phân phối từ bộ nhớ cache của CakePHP. Lý tưởng nhất, tôi muốn trình duyệt lưu các trang ngay cả khi chúng được phục vụ từ bộ nhớ cache của CakePHP (nghĩa là tôi muốn CakePHP trả về tiêu đề Last-Modified và phản hồi tiêu đề yêu cầu If-Modified-Since của trình duyệt, bất kể CakePHP có trả về một bản sao của trang được lưu trong bộ nhớ cache).

Tôi chỉ tự hỏi liệu đây có phải là hành vi được mong đợi hay không, cho dù tôi đang làm điều gì đó sai, hay là điều gì đó chưa được xem xét (hoặc không được cho là quan trọng).

Trả lời

2

Xem bộ nhớ đệm, theo bản chất, không thực sự thực thi phương thức của bộ điều khiển trên mọi yêu cầu. Tôi đoán nó thực hiện các hành động một lần và sau đó lưu trữ các đầu ra vào đĩa (hoặc, bất cứ công cụ bộ nhớ cache bạn xảy ra được sử dụng). Nếu bạn look at the CacheHelper's _writeFile method, bạn có thể xem cách chế độ xem được lưu trong bộ nhớ cache được tạo.

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

Nó tạo ra một Controller đối tượng mới (với một CakeResponse mới) và tải tất cả những người giúp việc, plugins, vv có thể được sử dụng trong giao diện và viết nó vào bộ nhớ cache.

Dường như việc thêm tiêu đề Last-Modified vào phản hồi của hành động/chế độ xem bộ nhớ cache có thể yêu cầu một số sửa đổi sâu đối với thư viện CakePHP cốt lõi.

+1

Có, mọi sửa đổi đối tượng Phản hồi được thực hiện bởi tác vụ Bộ điều khiển sẽ không được lưu trong bộ nhớ cache, điều này bao gồm cài đặt của tiêu đề Kiểm soát bộ nhớ cache. Có một vé mở về điều này (mặc dù không phải Caching liên quan): http://cakephp.lighthouseapp.com/projects/42648/tickets/2358-cachehelper-defect-with-response Cách giải quyết được đề xuất chỉ là đặt tiêu đề theo cách thủ công trong bố cục hoặc 'Controller :: beforeFilter()' (với tính năng gọi lại được kích hoạt). – pixelistik

Các vấn đề liên quan