问题描述
|
我正在使用一种称为Quickcache for PHP的东西,它可以提供网页的全页缓存。它运作良好,但是我唯一的问题是我拥有一个动态网站,并且某些功能在打开缓存时无法更新我想要它们的方式。
例如,如果用户登录,即使该用户已登录到服务器,登录框仍然会出现(我可以转到网站的未缓存部分,这将显示用户已完全登录) 。更改用户设置等也是如此。
我也不能每次用户登录或更改微小设置时都转储缓存,这太过分了。
似乎我无法缓存,因为它使网站无法使用,并且我不缓存该网站在任何明显的负载下都将无法使用。
我应该如何解决这个问题?一般而言,我对缓存还很陌生-我首次将其中一个站点投入生产。当然其他人已经解决了这个问题。
解决方法
我不是php人,但我可以告诉您有关缓存的信息。
为每个用户生成内容的动态站点最难有效地执行,但是可以做到。它将要求您查看数据在应用程序中的流动方式,以确定如何缓存,缓存在何处以及缓存什么。以下是一些准则:
每个用户或每个页面不变的数据-
缓存在应用程序内存中
抓住它而不是去数据库。
每个用户更改的数据,但不更改
每页-用户会话中的缓存
每页更改的数据,但不更改
每个用户-使用以下方法缓存在应用程序内存中
页面名称为键
每位用户每页更改的数据-
在页面名称为的会话中缓存
键
每个页面请求唯一的数据-不缓存。
不仅来自数据库的数据是缓存的候选者。如果您有一块处理数据的复杂逻辑,请考虑缓存该逻辑的输出。
,您很幸运能够立即访问您的网站,不是吗?
不确定此特定工具\“ Quickcache \”的工作方式如何,但从概念上讲,您需要做一个顶层PHP文件,其中包含可缓存部分的包含,以便从缓存副本中加载半静态部分以及包含每次加载动态内容的顶级文档。我相信Smarty可以让您使用模板来做到这一点。对于简单的情况(有些情况不是那么简单),我通常编写自己的代码。
然后仅在需要时清除包含文件上的缓存,可能是cron每天执行一次,或者是在管理更新中更改了代码中的值在代码中触发了该缓存。
,您使用的图书馆的文档很差,我找不到任何好的东西。
但是我建议使用例如Zend_Cache lib(如果您使用此框架)来制作自己的缓存系统。您将决定要缓存什么以及如何缓存,从而基本上可以达到最佳效果。
页面加载后,您将在高速缓存中检查页面,如果在页面中,请使用它。
这是我建议的最佳方法,因为您不想缓存一些动态操作(路线)。您可以简单地将它们排除在要创建的缓存系统之外。我对复杂的查询做了类似的事情,但是您可以缓存所有内容。在页面上更改内容后,您可以刷新缓存。
,抱歉,很高兴重新发布旧帖子,但是在阅读本文后,我认为OP问题仍然非常重要。
从我收集到的信息来看,您遇到的是个性化和新鲜度问题,这是在处理动态网站时非常常见的问题。
您需要做的是:
A.监视内容使用情况以标识经常保留(但不缓存)的动态对象。请注意,识别绝对(100%)不变的对象将有助于避免与个性化相关的问题,因此您需要确保使用的是交叉验证,坚如磐石的方法...(例如,检查Size(大小),向下至字节)。
B.找到合适的“潜在候选者”后,通过重写/创建新的HTTP缓存指令使其可访问。
C.继续监视内容使用情况,不时(经常)重新加载新版本并将其与当前缓存的对象进行比较,以使其保持最新状态。
这是要点。可以在此处找到类似的“学习”缓存机制的描述:动态缓存。
内部人员使用类似的学习启发法来缓存动态内容,并以5分钟的刷新率获取新鲜度。
GL。