预加载(Preload)WP Super Cache 缓存

昨天,著名的WordPress超级缓存插件WP Super Cache更新了版本与最新的WordPress 3.0兼容,同时对其多站点(MultiSite)模式兼容良好。该更新版本同时更新了很多功能,其中最突出的要算它的“预加载(Preload)”功能了。该功能让你可以预先读取所有的WordPress文章同时创建缓存文件,以避免在有人或者robot访问的时候再进行缓存,从而提高第一次访问某页面的响应速度。插件作者对这个功能做了评价,本文进行了翻译(并不是完全的直译)。读了该文,也许对你理解WP Super Cache的设置方法有很大帮助。

1. 简介

作为动态网站,内容都存储在数据库中,有访问的时候才根据数据库生成相应的页面。Preload 就是自动将这些页面提前生成并存储下来,然后将这些已经存储下来的静态页面提供给后来的访问者的一种功能。

Preload 其实很简单,就是通过服务器自动访问 WordPress 网站中的各个页面,然后将访问结果存储(或压缩存储)起来。在没有开启 preload 的时候,WPSC 是在某个用户访问某个页面的时候才将该页面存储(或压缩存储)起来。如果再有人访问同一个页面,则 WPSC 就提供已经存储的页面给他。

2. 其它说明

以下编译自原插件作者博客相关说明

图1 启用Preload前后CPU使用对比

上图是启用Preload功能前后的CPU使用情况图。从图中可以看出,启用Preload功能后,CPU占用减小了很多。其中一处很高的CPU占用峰值是预读时消耗的大量CPU。

该插件作者一直不鼓励用户预读以创建缓存(插件 Askapache Crazy Cache (此插件已废弃)能够为任何缓存插件来预读以创建缓存),主要是因为预读会创建非常多的缓存文件,从而有可能导致主机服务器出现一些问题。比如,如果你有数千的缓存文件,那么从以此磁盘故障中恢复的时候是需要非常多的时间的。

另一方面,Google已经开始以一个网站的响应速度作为判断网站好坏的一个指标。过去,该插件没有以缓存来响应机器人(搜素引擎爬虫/蜘蛛)的访问请求,因为爬虫机器人每个页面只访问一次,所以在它访问一次之后进行缓存是没有意义的。要想提高对搜索引擎机器人的响应速度,就应该在爬虫机器人(比如Google)访问之前将所有页面都缓存起来。

图2 WP Super Cache Preload设置界面

这就是该插件的预读(Preload)功能的设置界面。一旦你启用并开始预读,它会加载一个wp-cron任务来预读100个文章,然后计划下一次任务以读取下100篇文章,直到所有文章预读完毕。同时,它还会禁用对旧页面的垃圾处理,不过留言或者更新文章仍然会清理掉相关的缓存文件。

目前该插件仅仅缓存单个文章页面。缓存存档或者分类、标签页面是不划算的,因为很多网站已经告诉爬虫机器人忽略这些页面,而要更快的提供这些页面并不会让服务器少做多少工作。

只有当你使用Supercache(超级缓存)或者“ON”模式的时候预读特性才能够启用。该功能还正在开发之中新版本(v1.1)已经很好的支持了,不过,目前在作者的网站上工作得很好。我也启用了该特性,目前还没有发现什么问题。

另外,如果你是用如 /yyyy/dd/postname/ 形式的永久链接的话,你可能能够缓存任意多的文件。但是,如果你使用的是扁平的链接形式,如 /postname/ ,由于服务器限制,你可能无法缓存无限多的文件(对Linux ext2/ext3 文件系统来说上限是32,000个)。这一限制因不同的服务器系统和文件系统而有所差异。如果是Linux上的 ext2/ext3 文件系统,因其可以处理32,000个文件,那么你可以缓存31,998篇文章。另外2个文件是留给首页的,包含压缩和未压缩2个版本。

还有网友提到出现内存不足的提示。WPSC 进行 preload 操作的时候肯定要消耗一定的内存,但是一般情况下不会超过额定的 32MB。也许还有其它比较消耗内存的插件也在运行,加一起就超了。Preload 程并不会消耗太多的资源,与正常的访问是一样的。我观察过,基本是每次一个线程访问,每完成 100 个页面暂停 10s。

3. 相关设置

WP Super Cache 插件的功能越来越完善,设置也比较复杂,很多网友对如何设置有一些疑问。下面就关键问题进行总结,如果有新问题则会补充进来。

A. Preload 自动刷新(Refresh)时间设置

有几个网友在评论中(12)提到如何设置 Preload 自动刷新缓存时间的问题,我已经做了回答,今天把相关内容汇总发布到这里。

其实这个时间设置并没有什么特别的标准。具体设置为多大,要看你对网页更新的期望。下面根据经验提几个建议和需要了解的背景:

  1. 不设置得太小。作者建议是大于 30 分钟。太小了对造成较大的服务器负担,特别是对于评论比较频繁的网站来说。
  2. 建议值在 1 天 ~ 1 周之间。我最早设置为了 1 周了,后来觉得不过瘾,又给设置成 1 个月了,但是实际上每次不到 1 个月我就自己手动刷新缓存了。这个就看网站更新不是很频繁。
  3. Preload Refresh 的时间设置是针对所有静态页面的,也就是时间一到就将所有静态页面都更新一遍。新版本已经增加了相关设置,可以让用户选择在哪个时间段更新,比如网站访问量较少的凌晨三四点钟。Refresh 的过程并不会消耗太多的资源,与正常的访问是一样的。我观察过,基本是每次一个线程访问,每完成 100 个页面暂停 10s。
  4. 每次发布 / 更新文章的时候都会触发自动刷新缓存。但是可以 2 个选择:一是仅仅刷新该文章页面;二是刷新所有缓存。见 WPSC 设置的高级选项:Clear all cache files when a post or page is published.)(注意:网站首页总是会被更新的。)
  5. 每次有评论发布,也会触发自动刷新缓存功能。也可以选择是只刷新该文章的页面还是所有页面(高级选项:Only refresh current page when comments made. 同样,网站首页总是会被更新的。)。这个大家比较关心,因为使用了最新评论挂件。我觉得这个问题不大,所以都没有管它。如果你觉得某些页面的最新评论一直不变化不可接受的话,我有两点点建议:
    1. 使用多说等评论管理系统,一般都提供了 Ajax 异步加载的最新评论挂件,他们是从自己的服务器查询最新评论数据。
    2. 使用 WP Super Cache 提供的内置功能来禁止某一部分内容被缓存。例如,绝大多数 WordPress 主题都使用
      <?php get_sidebar(); ?>

      函数来显示页面边栏,也就是最新评论、最新文章等等挂件所在的位置,我们可以将这一行代码替换为下面的代码来使页面的这一部分不被 Preload:

      <!-- mfunc get_sidebar(); -->
      <?php get_sidebar(); ?>
      <!--/mfunc-->

      这是根据 WP Super Cache 的说明来设计的思路,未经测试。欢迎测试过的朋友反馈意见。

    3. 使用 JavaScript 加载最新评论,每次打开页面都单独向服务器查询最新评论。这个我没有用过,但是肯定有相关的插件来实现。

如果有新的问题,欢迎留言提出,我将尽力解答。©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/preload-the-cache-in-wp-super-cache/>。转载请保留此信息及相应链接。

28 条关于 “预加载(Preload)WP Super Cache 缓存” 的评论

  1. 引用通告: WordPress缓存插件性能对比 « 不存在的空间

  2. 引用通告: 付费空间解决了我的几个WordPress问题 « 水景一页

  3. 引用通告: 增加WordPress热门文章插件 « 水景一页

    • 或许您可以提些具体点儿的意见。
      preload 其实很简单,就是通过服务器自动访问 WordPress 中的各个页面,然后将访问结果存储(或压缩存储)起来。如果没有开启 preload,则某个用户访问某个页面后,WPSC 就将该页面存储(或压缩存储)起来。
      如果再有人访问同一个页面,则 WPSC 就提供已经存储过的页面给它以节省页面生成时间。因为作为动态网站,内容都存储在数据库中,有访问的时候才根据数据库生成相应的页面。Preload 就是自动将这些页面提前生成并存储下来的一种功能。

      • 不好意思,确实应该把问题提出来

        是这样,今天我的博客出现“Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate……的问题,网上普遍反映的是wp升级后的情况,我是很早就升级了,最近搬家后昨天才再次启用super cache。

        我把WP_MEMORY_LIMIT增大后,问题解决。

        这时我收到邮件,应该是super cache发的,Preload may have stalled.‏
        内容是Preload has been restarted.

        我怀疑是不是super cache造成的这个问题。另外super cache preload怎么设置才比较合理

        • 我刚看了看,的确写得比较粗糙,又给改了改。
          1、WPSC 进行 preload 操作的时候肯定要消耗一定的内存,但是一般情况下不会超过额定的 32MB。也许还有其它比较消耗内存的插件也在运行,加一起就超了。
          2、WPSC 的设置没有定论,需要根据你的博客更新速度和你希望旧的页面上抹些内容,如侧边栏的更新情况来权衡。建议设置为 1 天到 1 个星期内的时间间隔自动重新 Preload。

            • 就是看你希不希望每个页面上的留言都要实时更新,实际上没有必要。
              600 min 的确太短了。我的设置为一周了,不过有时候会根据需要手动更新。

  4. 还是没太明白这个Refresh。
    1. 当文章内容更新后,preload的静态页面应该会自动更新吧?
    2. 是不是留言这类东西不会触发更新?比如侧边栏上的留言小工具?
    3. Refresh是针对每篇文章的,还是多长时间批量更新一次?如果是批量,要是能设定在特定时间段更新就好了,放到访问量少的时间去更新。

    • 1、文章更新则静态页面自动更新,但是你可以在设置里选择是全部更新还是仅更新该文章页面(高级选项:Clear all cache files when a post or page is published.);
      2、可以设置仅更新该文章页面还是更新全部静态页面(高级选项:Only refresh current page when comments made.);
      3、Refresh 针对所有静态页面,无法设置在什么时间段更新(新版本已经增加了相关设置),但是可以根据下次更新的时常来控制,而且,它不会自动扣除完成更新所需要的时间。不过其实关系不大,Refresh 的过程并不会消耗太多的资源,与正常的访问是一样的。

  5. 引用通告: 博客维护记录:增加文章阅读次数显示 « 水景一页

  6. 那时间应该设置多少比较恰当 里面有这个设置
    刷新预装缓存文件()分钟。(0为关闭,至少30分钟。)
    不设置?还是设置多少比较恰当,求解,谢谢!
    我的网站是:www.pangu51.com

    • 这个问题在前面的评论中其实已经回答过了。我刚才又给总结了一下,请看这里
      如果要用 Preload 功能当然是要设置一个时间的了。

  7. 开了PRELOAD功能后,老是收到缓存重启的邮件,然后接下来就是服务器DOWN机了,网站打不开,重启服务器才行。。。网站是阿里云的,1G内存,咋说啊,博主大大。

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>