在 PHP 中缓存辩论/论坛条目


Caching debate/forum entries in PHP

只是在寻找一条建议。在我们的一个网页上,我们有一个辩论/论坛网站。每次用户请求辩论页面时,他/她都会获得所有主题的列表(以及他们的答案计数等)。

同样,当用户请求特定主题/线程时,该线程的所有答案都将向用户显示很长的用户名,用户图片,年龄,答案海报中的论坛帖子总数。

每次访问页面时,当前都会使用 MySQL 查询检索所有内容。但是,这开始变得非常缓慢(尤其是对于大线程,+3000个答案)。

我想以某种方式缓存辩论条目,以加快此过程。然而,问题是,如果我缓存条目,它自己,帖子数量等(当然是动态的),并不总是最新的。

当更新这样的东西时,是否有任何聪明的方法来缓存页面/重新缓存它们? :)

提前感谢,费舍尔

您应该根据

缓存的数据为缓存创建标记或名称。

例如,对于名为 Jake's Post 的帖子,您可以创建名称的 md5,这将为您提供标签 49fec15add24931728652baacc08b8ee

现在缓存内容以及与这篇文章有关的所有内容与标签 49fec15add24931728652baacc08b8ee。更新帖子或添加评论后,转到缓存并删除与 49fec15add24931728652baacc08b8ee 关联的所有内容。

现在没有缓存,当下一个访问者到达新帖子时,它将重建。

您可以通过为每个帖子添加多个标签来进一步细分这一点。 例如,您可以有一个用于评论和答案的标签,当添加评论时,删除评论标签,但不能删除答案标签。这减少了服务器在重建缓存时必须执行的工作,因为现在只缺少注释。

有许多库和框架可以帮助您做到这一点。

杰克

编辑

我会使用文件来存储数据,更具体地说是页面的 HTML 输出。然后,您可以执行以下操作:

if(file_exists($tag))
{
    // Load the contents of the cache file here and output it
}
else
{
    // Do complex database look up and cache the file for later
}

请记住,像Zend这样的框架内置了这种东西。我会认真考虑使用框架。

有趣的话题!

我要看的第一件事是优化您的数据库 - 即使您必须花钱升级硬件,它也比引入缓存更容易和便宜得多 - 更少的移动部件,更少的可能出错的事情......

如果您无法从数据库中榨取更多性能,那么我要考虑的下一件事是稍微取消规范化数据。例如,维护一个"reply_count"列,而不是计算每个主题的回复。这很丑陋,但出错的机会更少 - 运气好的话,您可以本地化数据访问层中的所有逻辑。

我要考虑的下一个选项是缓存页面。例如,如果你有合理的流量水平,仅仅缓存"辩论页面"30秒应该会大大减少数据库的负载,即使一切都出错了,因为你缓存了整个页面,它会在下次页面过时自行整理。在大多数情况下,缓存整个页面是可以的 - 如果在过去 30 秒内出现了一个新帖子并且您没有在您的页面上看到它,这不是世界末日。

如果确实必须在页面上提供更多"最新"内容,则可以在数据库访问级别引入缓存。过去,我构建了一个数据库访问层,该层根据关于缓存结果多长时间的硬连线逻辑缓存 SQL 查询的结果。在我们的例子中,我们构建了一个函数来调用数据库,它允许您指定查询(例如获取用户的帖子)、参数数组(例如用户名、日期)和缓存持续时间。数据库访问函数将根据查询和参数缓存缓存持续时间的结果;如果缓存持续时间已过期,它将刷新缓存。这个方案是相当防错的 - 作为最终用户,你很少会注意到缓存带来的怪异,而且由于我们保持了相当短的缓存周期,所以一切都很快解决了。

通过缓存内容片段来构建页面是可能的,但很快就会变得非常复杂。由于缓存策略不同,创建对最终用户没有意义的页面非常容易 - 由于"摘要"和"详细信息"之间的缓存策略不同,"未读帖子"加起来不等于细分中的帖子数量。