如何使用Smarty 3处理大页面的缓存


How to handle Caching for huge pages using Smarty 3

我目前正在运行一个拥有数百万动态页面的项目。这些页面的内容是从数据库中收集的,当然数据库太大了,有很多表。由于这些数据库内容不会频繁更改,并且为了减少MySQL连接和查询给服务器带来的不必要负担,我实现了Smarty缓存,根据内容类型,缓存时间为七天或一个月。

现在,我的问题是,我的单个缓存目录上有大量缓存页面,我开始认为这可能降低了整体性能。

那么,有人能告诉我在一个目录上缓存数百万个页面的性能问题吗?或者,我如何管理存储那些缓存的文件?或者,如何正确地将Smarty缓存用于大量页面?

将动态页面的HTML内容直接提供给用户。你可以用不同的方式做到这一点。有太多的方法可以做到这一点,但你有数百万页的页面,然后应用这个过程。

  1. 当任何用户首先检查该页面是否存在缓存时
  2. 如果没有,则缓存生成并提供页面
  3. 并且基本上在缓存文件到期时,您可以再次重新生成该缓存文件

我可以建议你的基于库是PEARcacheLiet,或者这很简单,你可以写自己的代码。但使用PEARcacheLite的好处是它有许多驱动程序,如文件、数据库和其他缓存系统。

对于缓存目录,您可以根据您的站点类别或您的站点所具有的标记来选择不同的文件。

您可能需要考虑使用Varnish作为反向代理缓存。它非常适合缓存大量静态页面。

我发现,除非我们要在循环中读取文件,否则将所有缓存文件放在单个目录中不会产生任何性能问题。

然而,smarty的最新版本存在问题(在撰写本答案时为3.1.13)(请参阅smarty论坛上的讨论)。在清除特定缓存id或组的缓存时,smarty会逐个读取所有文件,这需要一些时间才能删除单个缓存。