kn007的个人博客
♥ You are here: Home > 软件与网络 > Wordpress > 更新至WordPress 4.4.1

更新至WordPress 4.4.1

by | 12 Comments

提醒:本文最后更新于 3263 天前,文中所描述的信息可能已发生改变,请仔细核实。

gsvd2ng2078078wvv

更新至Wordpress 4.4.1,据说修补了安全漏洞、修正了 52 个问题。

但我比较关心的几个问题都没解决。

特别是打开评论管理占用大内存的问题。

问题主要体显在Wordpress 4.4更新后新增的_prime_comment_caches()函数,感兴趣的可以看原函数,真不知是谁写的。把当前页面(不管有无分页)所有评论的id缓存到object cache中,未启用object cache的不受影响。每次访问都会触发,也就是说你这页有10条评论,那么就会缓存10次(通过wp_cache_set),像我的评论管理页,里面有17000+条评论,就要缓存17000+次。造成页面打开慢,而且占用内存和cpu多。

进行17000+次缓存没问题,可以理解,但是问题是每次打开都要更新缓存(再次缓存17000+次),我真是了勒个去。

虽然里面是_get_non_cached_ids,但根本不会被取那些未缓存的,缓没缓存的都会被更新。奇了怪了,没时间自己检查。

在官网留了言,杳无音信,前一留言被我顶了后反而被封了。

关于Wordpress 4.4的其他问题可以见我之前的帖子:《WordPress 4.4的一些变更的修改》、《博客更新至WordPress 4.4》。

更新至4.4.1后,评论翻页又有问题了,直接获取的是全局评论,我晕。补充到《WordPress 4.4的一些变更的修改》这篇文章里面的第七个问题,WTF。


简单的看了下:
1.update_comment_cache的wp_cache_add未成功过。
2.因为第1点,所以_get_non_cached_ids的wp_cache_get得到false。
3.因为第2点,所以_prime_comment_caches得到所有评论id都未能成功缓存,所以要重新缓存,调用update_comment_cache,回到第一点。死循环了。
4._prime_comment_caches传进来的$update_meta_cache默认是true,在每次update_comment_cache的同时会调用update_meta_cache,好在update_meta_cache是可以成功执行,也就是说第一次不止17000+次Set,而是要X2,update_comment_cache+update_meta_cache,后续的就是17000+次Set(正确说是Add)。

这里面最重要的是第1点,update_comment_cache给wp_cache_add传了(两)个object(而非value)一直没成功过。导致后续动作死循环。

-------------------------------
真的想打人了。
居然在有主循环下(比如打开首页)的评论有缓存,打开评论管理页(edit-comments.php)是没有。
但这缓存有点怪,用wp_cache_get居然能得到值,但Memcached::Get()得不到,我晕了。
而且换个组来缓存数据就可以,换组意味着要改变Wordpress所有含组的条目,真不想动了。

我用wp_cache_set('test', 'test', 'comment')居然能wp_cache_get('test', 'comment'),但看不到该值存在于外部存储,看来只能查下哪里用了add_to_internal_cache了,太坑爹了。

发现Wordpress定义了plugins、comment、counts为内部缓存,说白就是php缓存。真是服了,干嘛不把comment_meta也放进去,神经。最大的问题是我没发现这是在哪里定义的。。。
-------------------------------------
抓到了
./wp-includes/ms-blogs.php:659: wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
./wp-includes/ms-blogs.php:730: wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
./wp-includes/load.php:477: wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
搞定后,内存有所下降,却仍然不小,但查询少了,算是有提高吧。

之前:Had 23 queries in 0.1978 seconds, page to load in 7.930 seconds, using 66.65MB memory.
之后:Had 12 queries in 0.0158 seconds, page to load in 7.716 seconds, using 52.34MB memory.

但你以为这就是胜利了么?太小瞧Wordpress了,有缓存后,所有评论只能看到父评论,看不到子评论,摔盘子!卧槽了。

转载请注明转自:kn007的个人博客的《更新至WordPress 4.4.1

donate
有所帮助?

Comments

12 Comments立即评论
  1. prime_comment_caches()这个评论缓存的功能鸡肋啊 :mrgreen:
    还不如来个异步处理
    沙发还是我的 :roll:

    1. MOD回复

      @World: 太鸡肋,准备让object cache忽略这些操作

  2. 感觉用了ghost之后好轻松啊,这么久更新了一个本版号 :evil:

    1. MOD回复

      @小怪物: WP问题多

  3. 换别的博客程序呗。

    1. MOD回复

      @wu先生: 较上劲了。。 :arrow:

  4. ……这个都能写一篇文章么?

    1. MOD回复

      @雨帆: 可以的,这是惯例。

  5. 回复

    实在不行 就换drupal吧

    1. MOD回复

      @Shrek: 不换。。。 :cry:

  6. 你的评论也太多了 0_0

    1. MOD回复

      @ArchiTech: 这不单是我存在的记录,更是许多人(曾经)在过的痕迹。

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif