gpt4 book ai didi

CakePHP 2.1 : Browser cache vs View cache

转载 作者:行者123 更新时间:2023-12-04 04:35:44 25 4
gpt4 key购买 nike

我对CakePHP 2.1中的 View 缓存和浏览器缓存一起工作的方式有疑问。

我刚刚将我的应用程序升级到CakePHP 2.1,并使用新的$this->response->modified方法设置了HTTP缓存(效果很好):

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 View 缓存:
class ArticlesController extends AppController {
public $cacheAction = array(
'view' => array('callbacks' => true, 'duration' => "1 week"),
}
}

单独使用时,两者都可以正常工作。但是,当两者都启用时,CakePHP View 缓存似乎会覆盖浏览器缓存(特别是,当从CakePHP View 缓存提供页面时,不会发送 Last-Modified header )。这将阻止浏览器缓存CakePHP的 View 缓存中正在提供的页面。

理想情况下,我希望浏览器缓存页面,即使页面是从CakePHP的缓存中提供的(即,我希望CakePHP返回 Last-Modified header ,并响应浏览器的 If-Modified-Since请求 header ,而不管CakePHP是否返回了缓存的副本页数)。

我只是想知道这是否是预期的行为,我是否做错了什么,或者这是否是未曾考虑过的(或被认为不重要的事情)。

最佳答案

本质上, View 缓存实际上并不对每个请求都执行 Controller 的方法。我猜它会执行一次操作,然后将输出缓存到磁盘(或您碰巧使用的任何缓存引擎)中。如果您使用look at the CacheHelper's _writeFile method,则可以看到如何构造缓存的 View 。

    $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)并加载 View 中可能使用的所有帮助程序,插件等,并将其写入缓存。

似乎将 Last-Modified header 添加到缓存操作/ View 的响应中,可能需要对核心CakePHP库进行一些深层修改。

关于CakePHP 2.1 : Browser cache vs View cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9739613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com