在CakePHP网站(2.3.1)上我注意到每页的缓存视图文件大小非常大(10-60MB)。
通常对于网站,我希望缓存只存储纯HTML输出,但Cake会在文件顶部添加序列化PHP。从性能角度来看,这个大文件大小是有问题的,占用了几千兆字节的空间(我们有1000页),并且不适合APC缓存(默认最大文件大小为1MB)。
这是缓存视图文件顶部的示例块:
<!--cachetime:1363985272--><?php
App::uses('StaticController', 'Controller');
$request = unserialize(base64_decode('<removed>'));
$response = new CakeResponse();
$controller = new StaticController($request, $response);
$controller->plugin = $this->plugin = '';
$controller->helpers = $this->helpers = unserialize(base64_decode('<removed>'));
$controller->layout = $this->layout = 'default';
$controller->theme = $this->theme = '';
$controller->viewVars = unserialize(base64_decode('<removed>'));
Router::setRequestInfo($controller->request);
$this->request = $request;
$this->viewVars = $controller->viewVars;
$this->loadHelpers();
extract($this->viewVars, EXTR_SKIP);
?>
我根本不喜欢PHP,因为下面的HTML是静态生成的输出。占据所有文件大小的巨大开销。
bootstrap.php中的缓存设置:
Cache::config('default', array('engine' => 'Apc'));
目前我唯一的选择是改善视图缓存文件的文件大小。此时此服务器上无法添加类似Varnish的东西。
解决文件大小问题的任何提示都会很棒。
答案 0 :(得分:0)
通过进行这两项更改,我最终能够大大减少缓存视图文件的大小。希望对遇到类似问题的人有用。
1 - 模型
模型之间存在许多关系,但我实际上只是在关系的一侧使用数据。例如,一篇文章有图像,但我也有一个关系,让文章属于一个图像,我从来没有。使关系“单向”即按需要减少重度查询。
2 - 控制器
在我的paginate数组中,我有'recursive'=>2,
,每页导致数百个额外查询。通过将此选项更改为'recursive'=>1
,我能够将重页面上的查询从900减少到20。在该模型上有大约6对多关系。这个递归级别必然会在某个阶段无意中滑入。
我仍然觉得CakePHP在缓存的视图文件中序列化PHP是很奇怪的。更优化的方法是没有任何PHP的静态HTML文件。