1

在 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 的内容。

解决文件大小问题的任何提示都会很棒。

4

1 回答 1

1

通过进行这两项更改,我最终能够大大减少缓存视图文件的大小。希望它对遇到类似问题的人有用。

1 - 型号

模型之间有许多关系,但我实际上只是在使用关系一侧的数据。例如,一篇文章有​​图像,但我也有一个关系来获取属于图像的文章,我从来没有这样做过。使关系“单向”,即根据需要减少繁重的查询。

2 - 控制器

在我的分页数组中'recursive'=>2,,每页导致数百个额外查询。通过将此选项更改为'recursive'=>1. 有问题的模型上有大约 6 个多对多关系。这个递归级别一定是在某个阶段无意中滑入的。

我仍然觉得 CakePHP 在缓存的视图文件中序列化 PHP 很奇怪。更理想的方法是没有任何 PHP 的静态 HTML 文件。

于 2013-07-03T12:11:13.017 回答