当前位置:首页 > 网站建设 > wordpress > Gravatar头像缓存的两难境地

Gravatar头像缓存的两难境地

正文索引[ 隐藏 ]

这段时间一直被一个小问题困扰着,如果有细心的博友注意到技术宅博客底部的查询时间会注意到,之前的查询次数虽然也不多,但是时间非常的长,有时候数据库查询次数(get num queries)也不多,但是整个页面的生成时间(timer_stop)常常接近一秒,这还只是首页,对于其他日志页等时间就更长,对于读者墙这个页面,当选出前100人的时候甚至会达到6到7秒。

页面生成时长的原因

今天终于有时间来查找这个问题的原因了,对于技术宅博客之前的首页,常常生成时间在接近一秒,联想到读者墙页面生成时间之长,我想可能的问题发生在头像缓存上,于是在后台禁用了头像缓存,果然生成时间减少很多,由此看来,造成页面生成时间加长的原因在于gravatar头像缓存。

深层次原因

既然知道原因在头像缓存,那自然得想办法解决它,当时写主题的时候之所以加入了头像缓存功能就是为了增加博客速度的,现在反而拖慢了速度,这不合理,首先把头像本地缓存的主函数贴上来:

function jishuzh_get_cavatar($source) {
 $time = 1209600; //The time of cache(seconds)
 preg_match('/avatar/([a-z0-9]+)?s=(d+)/',$source,$tmp);
 $abs = ABSPATH.'wp-content/themes/jishuzh/avatar/'.$tmp[1].'.jpg';
 $url = get_bloginfo('wpurl').'/wp-content/themes/jishuzh/avatar/'.$tmp[1].'.jpg';
 $default = get_bloginfo('wpurl').'/wp-content/themes/jishuzh/avatar/'.'default.jpg';
 $fileUrl = 'http://www.gravatar.com/avatar/' . $tmp[1] . '?d=404';
 $AgetHeaders = @get_headers( $fileUrl );
 if ( ! preg_match( "|200|", $AgetHeaders[0] ) ) {
 return '<img alt="" src="'.$default.'" class="avatar avatar-'.$tmp[2].'" width="'.$tmp[2].'" height="'.$tmp[2].'" />';
 }
 else{
 if (!is_file($abs)||(time()-filemtime($abs))>$time){
 copy('http://www.gravatar.com/avatar/'.$tmp[1].'?s=32&d='.$default.'&r=G',$abs);
 }
 if (filesize($abs)<500) { copy($default,$abs); }
 return '<img alt="" src="'.$url.'" class="avatar avatar-'.$tmp[2].'" width="'.$tmp[2].'" height="'.$tmp[2].'" />';
 }
 };
 add_filter('get_avatar','jishuzh_get_cavatar');

仔细分析一下这个函数,特别是在if判断的时候,第一个判断是为了验证评论者所写的邮箱是不是有对应的gravatar头像,因为想gravatar服务器请求返回头,如果是200则表示有头像,然后接下来在进行判断本地有无以及是否过期从而决定是不是复制到本地。
由此看来,对于每一个调用头像的地方,必须经过判断gravatar服务器有没有对应头像——本地有没有缓存——缓存有没有过期,对于第一个判断,显然的和当时不进行缓存的效果一样了,实际上都对gravatar服务器进行了get请求,而由于gravatar服务器的响应慢,导致我的页面生成时间长,这是问题的症结。

优化 ?

既然问题症结找到了,那便进行优化,下面是优化后的函数,实际上是去掉了第一个判断过程:

function jishuzh_get_cavatar($source) {
 $time = 1209600; //The time of cache(seconds)
 preg_match('/avatar/([a-z0-9]+)?s=(d+)/',$source,$tmp);
 $abs = ABSPATH.'wp-content/plugins/wp-gravatar-mini-cache/iava/'.$tmp[1].'.jpg';
 $url = get_bloginfo('wpurl').'/wp-content/plugins/wp-gravatar-mini-cache/iava/'.$tmp[1].'.jpg';
 $default = get_bloginfo('wpurl').'/wp-content/plugins/wp-gravatar-mini-cache/iava/'.'default.png';
 if (!is_file($abs)||(time()-filemtime($abs))>$time){
 copy('http://www.gravatar.com/avatar/'.$tmp[1].'?s=64&d='.$default.'&r=G',$abs);
 }
 if (filesize($abs)<500) { copy($default,$abs); }
 return '<img alt="" src="'.$url.'" class="avatar avatar-'.$tmp[2].'" width="'.$tmp[2].'" height="'.$tmp[2].'" />';
}
add_filter('get_avatar','jishuzh_get_cavatar');

但是这样是不是就是解决问题了呢?

两难的境地

回过头来,最初的方法,因为想gravatar服务器请求了返回头,导致速度变慢,那么“优化”后的函数是不是就会完全解决问题了呢?

总的来说,确实是解决一部分问题,但是,经过“优化”后的函数会产生新的问题:如果评论者没有注册gravatar头像,那么服务器会默认给一个默认头像,这个头像还是会复制到本地,当评论者很多都没有注册的时候,就会发生头一个文件,被复制保存了很多遍的结果,最后在请求页面的时候,如果使用页面载入分析工具就能发现“可以合并请求”。

所以,实际上对于这个问题貌似是陷入两难的境地,好像是没有一个最好的解决办法,用第一个函数,生成时间是硬伤,用第二个,会复制很多相同的文件,浪费空间,增加请求数量。

对我而言,没有更好的办法的情况下,选择了第二种方法。当然各位读者可能会有更好的办法,欢迎交流!

友荐云推荐
  • «
  • »
  • 作者:
    除非注明,本文原创:技术宅,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.jishuzh.com/web/wp/gravatar-cache-problems.html

    6 thoughts on “Gravatar头像缓存的两难境地

    1. Soar、毅

      博客的读者多数都是国内的吧?
      我的解决方式是调用多说的头像接口,他的规则和Gravatar是一样的。

      1. 技术宅 (Post author) 

        对于使用国内空间来说 你的方法应该会是很好的的

    2. Pingback: WordPress判断Email是否有Gravatar头像 - 技术宅

    3. 懒鱼

      我也开了头像缓存,貌似速度也不怎么样

      1. 技术宅 (Post author) 

        实际上不看数据 很难直接依靠感觉来知道的

    4. 一叶菩提

      一直用着,随着个人博客用wordpress的份额减少,确实受影响。

    评论已关闭.