WordPress wp_options表单ID持续增长的问题

WordPress的 options表保存的是WordPress的一些相关设置,一般安装后大约有一两百行记录,如果使用了一些比较高级的插件,这个记录会继续扩大。合理利用options可以推展WordPress后台的可配置选项,无需担心。

今天要说的是关于这个options表单不断自增的问题。在我们开发WordPress网站的过程中,发现options这张表总的记录数并没有问题,持续保持在一百多行的样子,但主键id却一直在断断续续地上涨,一个运行了一段时间的WordPress自增id居然达到了过千,甚至过万。

究其原因,这里面最终要的一点是,WordPress有一个 set_transient、和get_transient的功能用来存储一些临时数据,相关数据也都是记录在options表中。系统自带的,比如记录WordPress主题目录:_site_transient_theme_roots。顾名思义,transient,自然就不是持续化的数据,因此,对应还有一个:_site_transient_timeout_theme_roots 也就是数据过期的时间。在调用数据时候,如果数据到期了,就会删除记录,然后重新创建两条对应的记录。这一点让我觉得非常不理解,为什么是删除相关记录,重新再插入两行记录,而不是直接更新原因的数据呢?简单看了下WordPress源码,也没搞清楚。猜测大概是要照顾到一些其他功能。如果只是更新而非删除,有一些只用一次的数据,就会持续增长撑爆数据表。

简单理解,WordPress通过,set_transient和get_transient来存储一些临时数据,这些数据都有生命周期,到期后就会自动删除,然后重新插入,因此才有了本文开头说的,options表单总的记录并没有增加,但id却一直在持续上涨的大问题。

从数据库维护的角度来讲,这种临时数据并不会产生什么性能影响,但如果写入删除过于频繁的话,会导致数据库存在一些间隙,最好还是定期优化一下数据表。

通过简单摸索,提供几个减少临时数据产生的方法供有强迫症的同学参考:

  • 第一,在模板开发中不要使用 get_template_directory_uri 这类查询主题路径的函数。使用这类函数会导致网站频繁查找主题目录,也就会产生上面举例的site_transient_theme_roots临时数据。
  • 第二,使用缓存。对匿名用户可以使用纯静态缓存,这样大部分的浏览者,不会产生任何数据库读取操作。
  • 第三、可能是目前我找到的终极解决方法:使用memcached对象缓存,相关的知识就不再这里说了,不懂的可以去搜索一下。

关于第三个方法简单说下:

发现这个问题很偶然,当我发现某个正在开发中的网站options不断自增的时候,便去检查了下其他正在运营的网站,发现居然没有这个问题!百思不得其解,通过主题插件,甚至数据库完整替换,都没有找到答案,最终发现,因为线上运营的网站,是开启了WordPress对象缓存的,于是尝试将开发中的网站也开启对象缓存,果然,临时数据就不再增长了。具体原理不太清楚,估计应该是WordPress内部有一个判断机制,即当服务器开启了对象缓存,临时数据就直接采用对象缓存,而不再使用set_transient和get_transient。

以上笔记备用,供遇到同样困惑的同学参考。

 

当前余额:¥ 0.00  本次消费:¥ 0.00