如何在php中正确缓存文件

时间:2010-01-15 19:26:13

标签: php caching

我有一个帖子和多条评论的页面,使用PHP的ob_start()我能够成功缓存它。

在每条评论旁边,我都有一个用户名及其当前帖子和声誉的数量。现在我保留页面缓存的所有帖子,直到有人添加新评论,然后才更新缓存文件。

现在的问题是,用户的帖子编号和声誉会随着他对其他主题的发布/评论而增加,并且其帖子编号和声誉在老年帖子上不会改变。

解决此问题的最佳做法是什么。

3 个答案:

答案 0 :(得分:3)

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

你当然可以通过AJAX更新相关的声誉等,但很可能是连接&这消耗的带宽最终会超过首先缓存页面的好处。

如果缓存的主要目标之一是减少处理开销(而不是带宽消耗),您当然可以简单地将页面的非动态部分展平(每个帖子作为静态文本文件或类似文件 - 因此如果你正在使用Markdown或BBCode等,减少重新生成HTML的需要,并根据需要包含这些,如果它们被编辑则更新它们。

答案 1 :(得分:3)

如果您关注网站的性能,则应切换到APC,因为它提供了操作码缓存以及缓存作为键/值存储的方法。

您可以存储整个内容块,数组,对象,并将其命名为:

// 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);

答案 2 :(得分:1)

我的一些想法:

您可以选择将帖子页面缓存一段时间,例如一小时或15分钟。此时间取决于您在页面上获得的访问者数量,详细信息更改的频率以及您的个人偏好。因为用户的帖子数量是否稍微过时,确实无关紧要。在此期间之后删除缓存版本(也节省资源),如果再次访问该页面,将使用更新的详细信息重新缓存该页面。

通过聪明(重新)使用ob_start(),您可以缓冲页面的多个部分,例如帖子部分和评论部分。分别存储这些部件,您只需要重新生成一个部件而不是整个页面。大多数时候,帖子部分不会经常变化。

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

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