如何在PHP中正确缓存文件

4
我有一个页面,其中包含一篇文章和多条评论。通过使用PHP的ob_start()函数,我可以成功地将其缓存。
在每条评论旁边,我都有一个用户名和其当前发帖数和声望值。现在我一直保留着这个带有帖子的页面的缓存,直到有人添加了新的评论,然后我才更新缓存文件。
现在的问题是,当用户在其他主题上发布/评论时,他的帖子数量和声望值会增加,但在旧帖子上,他的帖子数量和声望值不会改变。
如何最好地解决这个问题?
3个回答

3
如果您关心网站的性能,应该切换到APC,因为它提供了opcode缓存以及用作键/值存储的缓存手段。
您可以存储整个内容块、数组、对象等等。
// you must supply:
// 1. a key you will later use to retrieve your content
// 2. the data you wish to cache
// 3. how long the cache should remain valid 
apc_store($key, $data, $ttl);

就检索而言,您只需进行如下调用即可:
$data = apc_fetch($key);

你有使用APC处理大量数据的经验吗?其中缓存会保留数月时间。我的想法是将所有数据存储,直到发生某些更改。这样可以吗? - Adnan

3

我有点希望被证明是错的,但我认为目前除了限制缓存持续时间之外,没有其他简单的方法。

当然,你可以通过 AJAX 更新相关的声望等内容,但这很可能会消耗连接和带宽,最终抵消了首次缓存页面的好处。

如果缓存的主要目标之一是减少处理开销(而不是带宽消耗),那么你当然可以简化页面的非动态部分(每个帖子作为静态文本文件或类似方式 - 因此,在使用Markdown或BBCode时减少重建HTML的需要)并根据需要包含它们/更新它们,如果它们被编辑过。


我可能在考虑将用户的个人资料作为单独的页面缓存,然后只需为该帖子包含每个用户的页面。但我不确定这是否是一个好方法。 - Adnan

1

我的一些想法:

你可以选择在一定时间内保留帖子页面的缓存,比如一小时或15分钟。这个时间取决于页面访问量、详细信息更改的频率和你个人的偏好。因为用户的帖子数量略有过时并不会真正影响到什么。在此期间结束后,删除缓存版本(也节省资源),如果再次访问该页面,则会重新缓存更新的详细信息。

通过巧妙地(重新)使用ob_start(),您可以缓冲页面的多个部分,例如帖子部分和评论部分。将这些部分分别存储,您只需要重新生成一个部分而不是整个页面。大多数情况下,帖子部分并不经常更改。

跟踪某个用户发布评论的页面(或者如果他创建了页面,则跟踪页面本身)。在用户详细信息发生更改(添加新帖子/评论)时,使这些页面过时(即删除缓存版本)。如果在短时间内有很多更改,您可以使用一些后台进程重新缓存页面,并使您的Web服务器响应灵敏。

插入令牌(唯一的文本片段,如%user:123,postcount%)以存储频繁更改的详细信息是另一种可能性。然后将此版本存储到缓存中,并在页面请求时用其详细信息替换令牌。如果每个时间段内的页面浏览次数非常高(或至少比详细更改的频率高得多),则可以将其与其他缓存技术相结合。


谢谢您的回答,我已经考虑使用令牌了。 - Adnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接