乌徒帮技术范WordPressWordPress使用 › WordPress开启缓存之后存在的问题及处理办法

WordPress开启缓存之后存在的问题及处理办法

分类:WordPress使用

我个人认为小型WordPress站点暂且没有必要开启缓存,如果需要缓存,主要还是在一些图片、脚本、css等静态资源上。对于很多开启了缓存的朋友,总会存在一些问题,本文就来探讨解决缓存引起的问题的一些思路。

缓存方式的分类

缓存分为两种类型,一种是浏览器缓存,可以通过服务器或php程序来实现,向浏览器发出强制缓存某些图片的命令,下次访问该资源的时候直接读取浏览器缓存中的资源。另一种是服务端缓存,一般来说是将原来的动态资源转换为静态资源,或者通过CDN加速。对于WordPress来说,如果开启了一些缓存插件,那么属于后一种情况。目前也有很多站点选择采用加速乐的CDN加速,我也尝试过,但由于缓存带来的问题,决定先不使用它的静态页面缓存。

缓存给WordPress带来的问题

无论是上述的两种缓存方式中的哪一种,都会给WordPress的正常访问带来一些干扰,我们就这些干扰简单的梳理出一些问题出来,以方便对症下药。

1、前台页面刷新无效,对界面的修改不起作用

对页面中的一些错位、颜色的修改、位置的重新安排是常有的事,但如果开启缓存之后,通过修改css文件试图进行调整,上传文件之后却发现怎么刷新都没有作用。这可能是有两种原因,一种是该css资源被缓存在本地浏览器,你再怎么刷新都用的是本地资源,而没有从服务器获取;另一种原因是,css资源通过cdn进行缓存,需要一段时间让网络节点上的资源更新之后才能看到效果,或在服务器中缓存,需要一段时间让服务器上的缓存更新。所以,如果你的站点开启了缓存,千万不要在进行修改时没有看到变化而紧张,这大部分原因是因为缓存带来的影响。

2、无法进入后台,即使进入也存在诸多问题

这种情况主要发生在开启浏览器缓存和使用cdn缓存时,当我们开启缓存之后,如果使用的是html一类的静态资源缓存,那么可想而知,后台也被缓存为静态资源,你登录到后台,可能只能看到在登录界面跳来跳去,也可能进入后台之后各种操作都没有效果。分明写了一篇文章,点击了发布,可是怎么都显示不出来。WordPress曾经有一个版本,因为缓存BUG,导致后台发布文章后后台文章列表中迟迟不能列出这篇文章,而且编辑文章也存在巨大问题。如果你使用缓存,记住,一定不要缓存后台。

3、无法看到提交的评论

对于一般的WP站点而言,提交评论仍然是使用WordPress自带的提交方式,但如果你开启了静态资源缓存,很有可能面临无法提交评论的情况。这种情况分为两种,一种是提交成功,但不能看到,另一种是提交都没有成功。当你开启了缓存之后,前台页面被作为静态资源进行了缓存,在缓存未更新时,你所看到的每一个页面都不会发生变化,包括你的评论区域,这个区域如果本来有10条评论,你提交评论之后,仍然是使用缓存中的静态资源,这个页面上仍然只有10条评论。而对于另外一种情况,缓存也可能会将wp-comment-post.php作为静态资源缓存起来,你提交到一个静态页面,当然不会进行任何数据库操作,评论提交不会成功,甚至提交评论后会跳转到一个非相关页面。

4、动态资源无法加载,网站失去很多体验功能

如果开启缓存,你不得不面对的就和3中的一样,网页再怎么刷新,都是这个页面,不会发生变化,除非你等到下一次更新。开启缓存之后,任何数据库相关的操作将失效,例如你使用了用户访问次数功能,每一个独立的用户访问一篇文章时会记录下这次访问,向$_COOKIE和数据库中增加记录,但如果你开启了缓存,那么这些动作将被省略掉,你的页面访问次数永远停留在开启缓存之前的那一次。同样,有的时候,你希望某些内容只有登录的用户才能查看,这个时候你要是开启了缓存,特别是使用cdn缓存时,它只会给你用户没有登录时的页面,你永远无法看到登录之后的页面。

解决缓存给WordPress带来的问题的思路

缓存带来的问题并非不可解决,但如果存在的问题太多,你最好列出一个表格,然后对照表格,系统的规划,一步一步的去解决。一旦开启缓存,你不得不面对一个系统工程来解决这些问题。总体来说,我将解决缓存带来的 问题的思路总结为4点:

1、缓存黑名单

在加速乐后台的加速自定义中有一个缓存黑名单,将wp-admin加进去,就可以避免后台被缓存。同样的道理,其他的cdn也应该具备同样的功能,或许功能更全面,或许可以使用正则表达式,或许可以根据IP来判断是否缓存,根据php执行动作来判断是否缓存等等。总之,将你不想被缓存的,带有一定规律的URL加入到缓存黑名单中。

2、API缓存更新

除了缓存黑名单,缓存更新功能更重要,它可以一键更新你的缓存,虽然有延时,但一般会在2-5分钟内生效,对于缓存在本地的,可能马上就能生效。但什么是基于API的缓存更新呢?我们用过DEDECMS的都知道,dede生成的是真的HTML文件,访问的也是真实的html文档,而且无论在发布文章还是发表评论之后,页面都能随时更新,不仅仅跟新自身而且与它有关联的,如首页、列表页,都会马上进行更新。我们也可以通过一个API,告知缓存机制:有新的内容被写进来,赶紧更新缓存。在遇到有数据库动作或必须更改页面的时候,我们就可以勾上这个API机制,但目前而言,我在加速乐并没有看到这个,而市面上的wordpress缓存插件好像也没有这个功能。如果你打算实现这个机制,除了在实现机制本身上有难度外,要找到所有需要钩子的动作也很难。

3、跨域

这是一个看上去比较复杂的方法,一般来说,缓存是有针对域的,例如我们对a.com这个域名下的所有资源进行缓存,但b.com也能同时管理这个站点的所有资源。我们不缓存b.com,利用b.com可以随时进行站点的管理。而访客只能通过a.com进行访问和操作,只要是涉及到数据库相关的任何动作,都提交到b.com。但这样做其实存在一定的风险,跨域对于浏览器而言是不安全的,所以限制比较多。但如果可以实现的话,也是不错的选择,我曾见过露兜博客,似乎也是采用这种方法。而将你的静态资源,如图片、视频、音频等等使用外链的形式也是解决这个问题的办法之一。

4、Ajax动态加载

这是最常见的方法,也是目前解决非cdn缓存的最重要手段,即使是cdn缓存,我们其实也可以通过这个方法来实现。ajax要实现两个功能:①数据的读取和打印;②数据的保存和更新。对于被缓存的页面,它们就像静态页面一样,死掉了一样,不会进行任何的数据更新,但如果你需要把你的页面访问次数打印出来,可以尝试通过ajax来访问一个可以继续执行动态操作的php文件,获得访问次数,把它动态加载到固定的位置。同样,虽然静态资源不能和数据库打交道,但你可以通过ajax向一个可以执行的php脚本发送向数据库增加一次访问次数的指令,这样这个访问次数就是在不断的变化中。

ajax解决缓存给wordpress带来的问题

但你必须承认的是,如果你要使用这种方法,你不得不面临同时编写php和javascript代码的巨大工程,每一个需要动态加载的数据就需要有对应的php和ajax代码来实现,如果页面上这样的部分很多,那可能是一项巨大的工程,而且ajax的加载方法如果涉及到核心内容,可能对seo带来影响。总之,这种方法执行力最强,却需要耗费大量精力和时间。

好了,这个问题就说到这里,关于WordPress中缓存带来的问题或许还有很多,我们无法考虑到每一个细节,这里只能是泛泛而谈,如果你有什么想法或补充,请一定在下面的评论框中留下你的见解,我很乐于和你互动。

已有1条评论 快速评论
  1. 免费部落 #4281楼 2014/03/13 17:44:34 回复

    学习了,很实用啊!

填写个人信息,赶快回复吧!