【发布时间】:2012-03-03 07:11:40
【问题描述】:
谁能解释一下这两个前端的区别 Zend_Cache_Frontend_Capture 和 Zend_Cache_Frontend_Page?
Capture 是页面缓存的默认设置...奇怪的是,它使用 get 变量生成 id,但是没有选项可以设置 make_id_with_get_variables 就像它的情况一样 页面前端....
有人能解释一下吗?
【问题讨论】:
谁能解释一下这两个前端的区别 Zend_Cache_Frontend_Capture 和 Zend_Cache_Frontend_Page?
Capture 是页面缓存的默认设置...奇怪的是,它使用 get 变量生成 id,但是没有选项可以设置 make_id_with_get_variables 就像它的情况一样 页面前端....
有人能解释一下吗?
【问题讨论】:
这是我努力解释两者之间的差异。
首先,让我们看看Zend_Cache_Frontend_Capture。参考资料指出,此类仅适用于Zend_Cache_Backend_Static。
您可以使用Zend_Cache_Frontend_Capture 来缓存与访问该站点的用户无关的整个页面。当您拥有与当前用户无关的静态数据(可能会不时更改)时,您可以使用此前端,也就是说,它对所有用户都是相同的(例如 RSS 提要或动态创建的 JavaScript 文件)。
进一步查看Zend_Cache_Backend_Static,你会发现这个后端有点特别。它需要您的 .htaccess 文件中的规则来协助提供缓存。一旦你用Frontend_Capture/Backend_Static 缓存了一些东西,PHP 和 Zend 框架就不会被用来提供缓存的数据。 Apache 根据您的 .htaccess 发现缓存文件存在,并直接将内容提供给用户,而无需调用 PHP。
另一方面,Zend_Cache_Frontend_Page 的工作方式不同。有了它,您不仅可以根据请求 URI 缓存内容,还可以根据 cookie、会话、GET 或 POST 参数中的信息来缓存内容。默认情况下,基于 cookie、会话、get 和 post 的缓存被禁用,因此要对登录到您网站的用户产生任何影响,您必须告诉缓存是否有任何页面要基于该缓存进行缓存信息。
一旦我创建了一个缓存并告诉它我想基于 cookie 和会话进行缓存,我现在可以缓存一个特定于一个用户的动态生成的页面。因此,如果人员 A 访问 /accounts/,则可以为该特定用户缓存包含从数据库中提取的帐户列表的页面。现在当 B 访问 /accounts/ 时,他们看不到 A 的缓存,因此现在为他们单独缓存页面,每个用户的信息都在他们自己的缓存中。
总之:
当您拥有可以缓存的数据对所有用户都相同时,请使用 Capture 前端。这将是一个更高性能的缓存,因为一旦页面被缓存就不需要 PHP 和 ZF。缺点是必须向 .htaccess 添加缓存规则
如果您想缓存页面,动态输出不仅基于请求 URI,还基于 cookie、会话数据或 get/post 参数,请使用页面前端。
希望这很清楚,可以帮助您理解差异。
编辑: 我相信我知道问题出在哪里,但不确定这是否属于错误。
Zend_Controller_Action_Helper_Cache::preDispatch() 根据请求 URI(包括查询字符串)生成缓存 ID。由于 jQuery 代码将查询字符串附加到 URL,因此您正在为每个请求 URI 缓存一个提要副本。 (在上述类方法中查找 $reqUri)。
我看到了几个选项:1) 查看您是否可以让代码不附加查询字符串(至少对于该特定 URL)或 2) 手动启动 Capture 缓存并传递您自己的 ID,而不是让缓存助手根据请求 URI 生成它。
【讨论】:
$cache->start('name', $tags) 告诉它您想要缓存,或者我只是缺少缓存管理器本身的某些内容。