W3 Total Cache Pro(简称W3TC)是老牌缓存插件,免费版本有有百多万安装量,好评众多。W3TC功能全面又强大,可以很细腻控制缓存内容,加速效果非常好,能做到很多其它缓存插件做不到的事情。
W3TC可以绕过动态内容缓存,有对象缓存、数据库缓存、页面片段缓存、缩小/延迟加载CSS、JS等功能,大大减轻服务器负担缩短页面加载速度。是真正有用的缓存插件,本站使用W3 Total Cache Pro(点击下载)加速。
本站一开始使用Wp Rocket加速,可能我服务器配置有问题,html的浏览器缓存关闭不生效导致访客登陆后依然显示未登录状态(头像等内容不显示)。最后使用W3 Total Cache Pro完美解决问题,因为它使用下图文件配置浏览器缓存。
因为设置选项太多,很多人不懂设置导致无法发挥效果,所以它的名气不如Wp Rocket、Fastest Cache。实际上如果用得好它的效果比Wp Rocket还好!写这篇W3 Total Cache设置教程的目的就是让小白也能做出适合自己网站的设置。
建议搭配Perfmatters资产清理插件使用,2者配合效果绝对甩Wp Rocket几条街。
注意:如果是VPS主机 (非共享主机)+Nginx系统,更改W3 Total Cache设置后建议重启Nginx方可生效。
W3 Total Cache设置教程
如果设置之后顶部提示下图内容,需要重启Nginx后设置才能生效。
不同网站情况不一样,以下设置仅供参考。不懂的设置建议保持默认,大概率不会出错。下面设置教程截图是W3TC Pro界面,如果使用免费版本有些功能会显示禁用。如有疑问欢迎下方评论留言。先了解一些基本概念:
页面缓存 (Page Cache) - 访客访问页面时服务器都需查询数据库、运行脚本后生成输入页面。开启页面缓存会吧已完成页面副本存储起来,后续访客直接访问页面副本,无需查询数据库和运行脚本,从而大大减小加载页面时间和服务器压力。
操作码缓存 (Opcode Cache) - 缓存已编译的PHP代码结果,使得相同PHP代码的后续请求更快。
页面片段缓存 (Page Fragment Cache) - 页面片段缓存是页面缓存的一个高级功能,免费版本可用。通常一个页面如果含有动态内容,需要设置整个页面不被缓存(默认无法做到只缓存某些内容),保证动态内容正常显示,可是速度会很慢。
最好的做法是页面的静态内容被缓存,优先加载,动态内容单独缓存单独加载,这样速度最快同时保证动态内容正常显示。页面片段缓存的作用就是实现这个目的,通过添加注悉来选择动态内容区域动态加载,其它没注悉的区域被静态缓存,优先加载。
页面片段缓存非常非常非常适合电商网站以及含购买/仅会员可见内容的网站,对速度提升有很大帮助。可是对外贸网站或者博客网站没多大作用,所以外贸和博客网站不建议启用这个功能。
页面片段缓存(Fragment Cache) 的使用方法是编辑PHP模板,在要绕过缓存的动态内容代码上面和下面各加1段代码标记,所以它的使用范围和条件比较有限,使用门槛高。点击查看片段缓存详细使用方法。
注意:启用页面片段缓存后可能会导致编辑主题 functions.php之类文件无法保存,需临时禁用片段缓存才能编辑。或者使用Code Snippets等插件插入代码,代替functions.php。
Tips: 要使用页面片段缓存,页面缓存的方法不能选“磁盘: 增强”,只能选“磁盘: 基本”或者基于内存的方法。如果要使用插件函数或 WordPress 函数,则必须在页面缓存设置中启用延迟初始化。
Tips:页面片段缓存和片段缓存是完全不一样的东西,启用方法,控制程度等不一样。不过它们的作用相同,都是实现缓存页面静态内容的同时,单独、正确地加载动态内容,2者一起使用效果最好。
片段缓存 (Fragment Cache) - 片段缓存需要先在下图“扩展”里面启用,才会出现在“常规设置”里面。片段缓存是缓存一些动态数据,或者结果,可以是数据库查询也可以是板块html内容。
可以简单得把片段缓存理解为对象缓存,2者主要区别是缓存的内容不一样。片段缓存主要用于存储短期过期的简单数据,而对象缓存则用于存储复杂或较大的长久数据。同时使用片段缓存和对象缓存,可以实现更精细的缓存控制,提高网站性能和用户体验。
数据库缓存 (Database Cache) - 缓存MySQL数据库查询结果,有助于释放每次返回相同数据的重复查询所占用的MySQL 服务器资源,以便它有更多的能力来处理真正的动态数据。
虽然对象缓存将存储已执行的PHP,但它可能不包含从数据库检索的信息,不会缓存对数据库的大部分调用。如果在启用对象缓存后还有许多正在执行的数据库查询,应该启用数据库缓存,反则不建议启用。
总结:一般只建议使用对象缓存,它是数据的集合,一个对象可能包含几个数据库的数据,可以在很大程度上代替数据库缓存。对象缓存是html页面缓存补充,抓漏网之鱼(一些没被缓存的动态请求)。
对象缓存 (Object Cache) - 缓存已完成的数据库查询结果。虽然页面缓存可以通过缓存静态页面极大地帮助减少站点的响应时间,但仍然有许多未缓存的对象请求。对象缓存将通过缓存这些对象进一步提高性能。
对象缓存允许更有效地从数据库中获取数据。它的目的类似于数据库缓存的作用。但与数据库缓存相比,对象缓存更高效,因为它允许处理更少的请求。
对象缓存是WordPress核心、主题和插件可以在对象存储中存储一些经常访问且很少更改的数据。这样就不必在每次请求时都检索和处理这些对象。最终,对象缓存将减少每个页面所需的数据库查询总数,并且由于 CPU 不必重建这些数据块,您的响应时间将减少。
浏览器缓存 (Brower Cache) - 这会将网页的副本放入用户浏览器缓存中。当该用户使用同一个浏览器重新访问同一个页面时,它将从存储在他们计算机上的缓存中加载,而不是查询网络服务器。
磁盘: 基本 - 此方法将调用 PHP 脚本来为缓存页面提供服务,性能最差。
磁盘: 增强 - 此方法从 Apache 或 Nginx 加载缓存页面,因此速度比Disk更快,推荐使用。如果网站速度变慢,改选“磁盘: 基本”方法。
磁盘(Dick)缓存- 将缓存文件存放在磁盘。
Memcached缓存 - 将缓存文件存放在内存,绝大多数情况下比磁盘(Dick)缓存缓存快。查看Dick缓存和Memcached缓存速度对比。
Tips:共享主机(服务器)的磁盘读写速度一般有限制,不会很快。所以共享主机如果启用数据库缓存或者对象缓存,方法尽量不要选磁盘,建议选内存(Memcached/Redis)。
设置教程:
先使用设置向导检测适合自己网站的设置,点击“安装指南”进入快速设置指导。注意:一定要以前台实际访问速度为准,这个测试不一定准。设置好后测试下,速度慢就改下设置,或者禁用数据库缓存和对象缓存功能。
直接点“下一个”↓。
点“测试页缓存”↓
选时间最短那个。点“下一个”按钮进行下一个测试。全部设置完后如果网站访问速度变慢,页面缓存换个选项试试。我们有个网站使用“磁盘: 增强”速度很慢,改成“磁盘: 基本”速度恢复正常。
点“数据库缓存按钮”↓,不管测速结果怎样,直接选“无”,如何点击“下一个”按钮。
这里解释下:数据库缓存功能兼容性不好容易引起问题,默认情况关闭。下面的对象缓存功能效果更好完全可以替代它。MySQL 8.0取消了数据库缓存功能,因为它有些情况下速度更慢。
点“测试对象缓存”按钮↓,选时间最短的,点击“下一个”。如果测试出来“无”的速度最快,再测试一次,大多数情况下应该选“Redis”或“Memcached”,这2这速度快生成的缓存文件体积也小很多。
Tips: 使用宝塔面板的话,需要先在PHP设置里面安装“Redis”和“Memcached”扩展。
点“测试浏览器缓存”按钮↓,不管结果怎样,直接选“已启用”,如何点击“下一个”按钮。
图片优化建议不要启用,它功能和效果一般,直接点击“下一个”按钮。我们建议禁用,改用ShortPixel或者Ewww等图片压缩插件效果和体验更好。
延迟加载不建议启用,直接点击“下一个”按钮。W3TC论坛很多人发帖说启用后图片显示异常,建议使用Perfmatters的图片延迟加载功能代替(效果最好)。
常规设置
Pro版本的话建议先进入“扩展”板块,启用所需功能。
如果是Pro版本建议安装Fragment Cache;如果使用Yoast插件,安装Yoast SEO扩展;如果使用Cloudflare CDN,安装CloudFlare扩展。
WebP Converter不建议启用,因为不是很好用而且不支持转Avif格式。建议查看迪亚莫写的《终极WordPress图片压缩优化教程》,选择合适图片压缩方案。
设置完后,如果是VPS主机(含托管式)需要重启Nginx设置生效,如果是共享主机不需要重启。
接下来点击下图 “常规设置” ,开始设置插件其它内容。
页面缓存在设置向导已经启用并且选择了缓存方式,所以不需要再额外设置,保持默认即可。
压缩按下图设置,Minify mode一定要选Manual(手动),如果选Auto网站显示很大概率出问题。Minify Cache Method选Dick比较安全,选其它容易出错。另外3项按图选,这里只使用W3TC的压缩功能,它的延迟JS/ CSS功能兼容性不好效果一般不建议选择。
操作码缓存(Opcode Cache)按图设置↓。
数据库缓存、对象缓存、浏览器缓存 在上面“安装指南”设置向导里面已经设置过,这里直接跳过不要管。如果以后不启用数据库缓存,记得回到这里启用数据库缓存代替,Method选Memcached。
下图是我网站设置,因为服务器原因我单独使用Object Cache Pro插件实现对象缓存,所以这里没有启用这2个功能↓。
无论任何情况,下图浏览器缓存都应该启用。
Purge via WP Cron 是设置定时任务自动清除全部缓存,可以理解为设置缓存有效期,到期自动重清除。
加元 是CDN重写网址功能。作用是把页面的CSS/JS/图片等常规网址改成CDN网址,这样才能从CDN加载相应资源。Wp Rocket、Perfmatters之类插件都有CDN重写网址功能。只需要在一个插件启用这个功能就行,不要在多个插件启用,会有冲突。
如果要使用,先勾选“启用”,按需选择下图红色框类型。如果使用国内腾讯云、七牛云之类CDN选“通用镜像(Generic Mirror)”↓。
我们使用W3TC的CDN功能改写网址后发现Perfmatters的删除无用CSS生成的used.css无法加载,提示网址错误。改用Perfmatters CDN重写网址功能恢复正常,而且能重写更多资源网址。有的选的话尽量别用W3TC的CDN功能。
反向代理 位于网络服务器和WordPress之间,可用于对传入请求执行各种基于逻辑的操作。如果不懂是什么意思保持默认,绝大多数网站用不上它。
消息库 允许在动态服务器池之间共享策略管理。例如,池中的每个服务器使用操作码缓存(不是共享资源)和清除,然后在任意数量的服务器之间实时同步;因此,即使资源不共享,每个服务器的行为也相同。
看不懂忽略就行,对于99.99%的人来说没用。
用户体验 设置比较多,迪亚莫建议使用Perfmatters插件的相同功能代替下图功能所有,功能更强大,效果更好。如果你不想用Perfmatters插件,按需启用下图功能就行。
统计 功能建议禁用。启用后,会多出一个“统计”板块 ,可以查看下图数据,迪亚莫觉得意义不大。启用会降低前端访问速度,建议禁用。
片段缓存 需要先在“扩展”里面启用,才会出现在“常规设置”里面。片段缓存非常非常非常适合电商网站以及含购买/仅会员可见内容的网站,对速度提升有很大帮助。启用的话方法选“内存缓存” 或者Memcached、Redis,自己对比测试。
杂项 建议保持默认,绝大多数网站用不上,没啥特别意义。
调试建议保持关闭。感兴趣好奇可以启用看下,记得只开短暂时间后就要关闭。
WebP Converter是图片转WebP功能,小莫我觉得不太好用,效果一般。建议禁用,改用ShortPixel或者Ewww等图片压缩插件效果和体验更好。
Google页面速度需要链接谷歌账号在网站使用谷歌测速。建议禁用,直接进入谷歌测速官网测速更好。
导入/导出设置很好理解,不多解释。
常规设置到此结束,下面是各个功能详细设置。
页面缓存设置
“已登录用户不缓存页面” 和 “以下用户组不缓存页面” 这2个功能要专门说下。如果你想让所有登录的用户都绕过(不显示)缓存,只启用“已登录用户不缓存页面” 就行。
如果你想让某些登录的角色绕过(不显示)缓存,让其它登录的角色显示缓存,禁用“已登录用户不缓存页面” 然后启用“以下用户组不缓存页面”,再勾选要绕过(不显示)缓存的角色。
Aliases(别名)功能允许缓存在不同域上(例如 domain.com 和 www.domain.com)可用的相同 WordPres 内容。我们不建议启用此功能,如果有不同域最好的方法是301重定到同一个域,以避免来自 Google 和其他搜索引擎的重复内容惩罚。
Cache Preload是缓存预加载功能,按图设置,红色框输入你网站站点地图(.xml结尾)完整网址。其它保持默认,如果预加载间隔太短会导致服务器高负荷。
Purge Policy: Page Cache是设置什么情况下应该自动清理网站页面缓存。如果你不知道该怎么选择,按下图设置,使用绝大多数网站。当修改页面/文章/列表页或者文章有新评论时会自动清理缓存。
下图没勾选的那几项没啥用,Blog feed也是,不建议勾选。
REST API↓设置是否缓存REST API,REST API让您可以查询 JSON 格式的数据,建议选择“Don't cache’”。我们之前选择“Cache”导致微信公众号自定义回复功能失效,选“Disable REST API”导致隐藏保护内容插件功能异常。
Advanced设置,除了下面提到的内容,其它内容建议保持默认。
Late initialization和Late caching仅适合某些插件某些情况,绝大部分情况下不需要启用。如果General Settings里面Cache Page Method: 选择“Disk: Enhanced”,Late initialization和Late caching不可用。改成“Disk: Basic”即可。
Late initialization:即延迟初始化,是一种在编程中初始化对象的方法。当一个对象在另一个对象引用它时才在内存中创建。延迟初始化依赖于片段缓存(fragment caching)功能,如果没有使用片段缓存就不要启用它。
Late caching:即延迟缓存,是延迟缓存页面的方法。它允许在W3 Total Cache 处理缓存之前加载部分WordPress 内容。延迟缓存可用于某些特定情况,例如用于地理定位目的。绝大部分情况下不需要启用。
Compatibility mode: 如果缓存方式选择Dick: Enhanced,在Late caching下面会新增一个Compatibility mode选项。官方建议仅在遇到Apache rules相关问题时才启用这个功能,启用后性能大概降低20%。
Rejected cookies↓: 把需要绕过缓存的内容的cookies输入进入,一行一个。
Never cache the following pages↓: 把不需要被缓存的页面网址输入进入,一行一个。
Minify设置
设置压缩HTML、CSS、JS细节,这里如果设置不对网站容易出现显示错误,按图设置即可。如果网站显示出错,注意禁用选项排查。
Database Cache、Object Cache、Fragment Cache
这3个选项卡里面的设置如果不懂是什么意思,保持默认即可。
Database Cache(数据库缓存)和Object Cache(对象缓存)作用挺大,某些情况下可能会导致网站问题。例如数据库缓存可能会导致CPU占用过高,如果出问题逐一禁用这2个功能,清处W3TC缓存排查问题。
启用Object Cache后如果网站后台插件设置、文章编辑之类功能出现异常,切换到Database Cache或者关闭该功能试下。
Browser Cache
按下图设置
CSS & JS设置按照下图。
HTML & XML设置按照下图,如果你网站会员功能,登录后会显示不一样的动态内容 (例如本站右上角头像之类),下图红色框设置为2秒。这样登录后不会显示被缓存的内容。要搭配页面缓存设置里的“ 已登录用户不缓存页面”功能一起使用。
Media & Other Files按下图设置↓,其它选项保持默认。
Security Headers对速度没啥大帮助,主要是提高网站安全性。
其它保持默认。
Cache Groups(手机端单独缓存)
Cache Groups的作用是设置手机端单独缓存,按图启用tablets(桌面)和phones(手机)用户组,选择tablets和phones使用的相应主题,如果只是使用一个主题(响应式),都选一样就行。其它设置保持默认。
很多优化功能依赖于手机端单独缓存,例如Perfmatters插件控制代码只在手机端启用,需要网站先启用手机端单独缓存功能才能生效。
tablets(桌面)↓
phones(手机)↓
更多详情查看:https://wordpress.org/support/topic/set-up-the-caching-separately-for-mobile-and-desktop/。
CDN设置
如果没有使用CDN这里不要设置。如果有安装Perfmatters之类插件,使用Perfmatters的CDN功能好点。
输入加速域名,保存。
可以点“Test Mirror”测试一下,显示“Test passed”代表成功。
查看前台显示是否正常,查看源代码发现资源网址已经变成cdn加速域名。
其它设置保持默认。
User Experience
这里设置图片和谷歌地图延迟加载内容,如果没有启用相应功能忽略不用设置。如有启用延迟加载,按图设置即可。
注意事项
排除页面被缓存
后台登录地址,个人中心,购物车等页面不应该被缓存,需要排除掉。在 “页面缓存”板块 > “高级”设置,Never cache the following pages:里面填写需要排除被缓存页面网址。
如果要根据Cookies排除所有页面被缓存,在“高级”设置下图位置输入cookies。
如何使用页面片段缓存
新手不要使用这个方法,容易出问题。有些页面构建器搭建的内容也添加不了注悉,用不了这个方法。
1):首先需要在网站根目录的wp-config.php文件中添加下面代码启用注悉功能,somesecurestring可以自定义,例如我们改成diiamodynacache。
define('W3TC_DYNAMIC_SECURITY', 'somesecurestring');
然后编辑相应文件php模板,在动态内容前后加上注悉<!-- mfunc somesecurestring -->,就行。这个注悉有下面5种使用方法。
Example 1:
<!-- mfunc W3TC_somesecurestring any PHP code --><!-- /mfunc somesecurestring -->
Example 2:
<!-- mfunc somesecurestring -->any PHP code<!-- /mfunc somesecurestring -->
Example 3:
<!--MFUNC somesecurestring -->
echo rand();
<!--/mfunc somesecurestring -->
Example 4:
<!-- mclude somesecurestring path/to/file.php --><!-- /mclude somesecurestring -->
Example 5:
<!-- mclude somesecurestring -->path/to/file.php<!-- /mclude somesecurestring -->
2):在“压缩”板块,下图排除框内输入mclude和mfunc,一行一个。
3):在“常规设置”板块,下图 页面缓存方式不能选“磁盘:增强”,其它都可以选。
如果动态内容使用了WordPress函数和钩子,需要在“常规设置”板块启用下图“延迟初始化”功能。下图之所以显示不可启用是因为我“页面缓存方式”选择得是“磁盘:增强”,改选其它就可以启用该功能。
动态内容缓存显示失败,被缓存
如果使用页面片段缓存和片段缓存功能成功,不会存在这个问题。一般是使用全页缓存功能,内容使用Ajax之类加载,页面缓存被浏览器缓存了,所以动态内容没有更新成功。
在“浏览器缓存”设置板块,按我们上面建议设置动态内容应该能正常显示。如果出现登录后显示未登录状态,用户头像和一些登录后可见内容不显示,侧边栏不显示,需要刷新页面才会显示。按照下面方法设置。方法来自W3TC支持论坛。进入Browser cache (浏览器缓存)设置页面。
顶部“常规设置”↓,下面2项不要勾选启用。
HTML & XML↓按下面指示设置即可。
设置完后,如果是VPS主机(含托管式)需要重启Nginx设置生效,如果是共享主机不需要重启。
和Object cache pro等对象缓存一起使用
官方说可以和Object cache pro等对象缓存插件一起使用,分工不同,没有影响。
W3TC所有WP Cron任务设置和功能汇总
下图汇总了插件可以启用/设置WP Cron任务的地方,以及相应WP Cron的作用。一目了然,按需设置。
W3TC常见问题
1- 安装W3TC后修改functions.php等文件如果提示下面问题,临时关闭片段缓存(Fragment Cache)功能即可。添加代码最好的办法是使用Code Snippets 等插件,安全稳定高效。
W3TC > General Settings,按下图关闭Fragment Cache。
2- 前台提示mysqli_num_fields() expects parameter 1 to be mysqli_result, bool given in /www/wwwroot/xxx.com/wp-includes/class-wpdb.php on line 3574
是W3TC数据库缓存(Database Cache)导致这个问题,关闭数据库缓存改用对象缓存(Object Cache)即可。
3- 使用W3TC后速度变慢很多。不同服务情况可能差别很大,可能有的服务器没配置好、限制多或者有Bug(例如宝塔面板的MariaDB10.7.3数据库不稳定)。所以使用这个插件后可能会因为一些错误导致速度很慢。
速度变慢的话逐一试下:
1) 页面缓存更改缓存方式为Disk: Basic;
2) 数据库缓存和对象缓存逐一更改缓存模式,如无效果就逐一关闭这2个功能看下;
记得修改后清理缓存查看最新效果。
其它更多设置查看详细W3 Total Cache设置教程,这篇教程虽然有点旧,可是写得非常详细。有些选项可能过期注意看设置内容,例如教程page cache设置里面有个选项是“Cache front page”(建议勾选),是在新版本里这个选项变成“Don't cache front page”(不建议勾选),意思完全相反。
4- Elementor编辑页面一直转圈圈,只有个别简单页面能打开,复杂页面打不开。F12查看很多资源提示函503无法加载。是插件冲突,禁用下图功能,如果是VPS主机需要重启Nginx,刷新恢复正常。
下面功能如果启用,选红色框那个