前不久,avatar头像被墙了,导致wordpress或者emlog等用到avatar头像的开源程序网站打开异常缓慢,头像始终加载不出来, 后来网上查找方法,各大博客都在提到这个问题并给出了一致的解决方案,就是用多说缓存的avatar头像替换avatar服务器的图片,速度虽比不上 avatar官方服务器的速度,但还算比较好,貌似很不错的样子,我也就用上了,可是现在发现多说服务器越来越慢了,时不时还加载不出来几个头像,我想是 因为avatar的事故导致越来越多人调用多说服务器的头像,造成网络拥堵的现象。看来谁都不能信任了~我还是喜欢独占资源~看到网上几年前有人写的从 avatar缓存图片到本地的方法。经过测试,已经不能从avatar官网抓到图片了,那就只能从多说服务器去抓取,前后两种方法整合在一起就通了。只要在wordpress主题的functions.php文件里加入以下代码:
//把多说服务器头像迁移至我的服务器
function get_avatar_uctheme( $avatar ) {//用多说缓存头像
$avatar = preg_replace( “/http:\/\/(www|\d).gravatar.com/”,”http://gravatar.duoshuo.com”,$avatar );
return $avatar;
}
add_filter( ‘get_avatar’, ‘get_avatar_uctheme’ );
function my_avatar($avatar) {//把多说头像下载到本地
$tmp = strpos($avatar, ‘http’);
$g = substr($avatar, $tmp, strpos($avatar, “‘”, $tmp) – $tmp);
$tmp = strpos($g, ‘avatar/’) + 7;
$f = substr($g, $tmp, strpos($g, “?”, $tmp) – $tmp);
$w = get_bloginfo(‘wpurl’);
$e = ABSPATH .’avatar/’. $f .’.jpg’;
$t = 1209600; //单位:秒(14天)
if ( !is_file($e) || (time() – filemtime($e)) > $t ) { //不存在或文件超过14天就重新抓取下载
copy(htmlspecialchars_decode($g), $e);
} else $avatar = strtr($avatar, array($g => $w.’/avatar/’.$f.’.jpg’));
if (filesize($e) < 500) copy($w.’/avatar/default.jpg’, $e);
return $avatar;
}
add_filter(‘get_avatar’, ‘my_avatar’);
然后在wordpress安装目录(一般是网站根目录)里面创建一个文件夹并命名为avatar,确保这个文件夹具有可写权限,然后准备一张默认图 片avatar.jpg放到该文件夹里面,这样就ok了。最后找一个头像比较集中的页面刷新下,比如说留言板头像墙页面,这样可以把大部分头像预先 download下来。以后直接读取本地图片就行了。
优点:独立性强,速度快,图片网址可控。
缺点:第一次加载页面的时候或者更新的时候页面会比较慢,对于大量头像同时缓存会占用服务器大量i/o,当然你可以把更新时间设得很长或者永不更新~本站采用的就是长久性更新,大概一年吧,有换头像的通知我删除。。。。