温馨提示:
本文所述内容不具普遍性,可能因操作环境差异而与实际有所出入,故请勿照搬照抄,仅供参考。
以评论头像为例,魔改版主题优先获取 QQ 头像,但是直接通过链接显示头像,虽然可以提升加载速度,但会泄露评论者的 QQ,故需采取将头像下载到本地,然后以本地资源显示,主要代码如下:
/**
* 头像:先QQ、再 gravatar、最后是默认的
*
*/
function avatar( $email) {
$switchav = Helper::options()->qqavatar;
if ( empty( Helper::options()->cacheTime ) ) {
$ct = 2592000;
} else {
$ct = Helper::options()->cacheTime;
}
$size = '32'; //大小
$emaill = strtolower(trim($email));
$hash = md5($emaill);
$ext = '.jpg';
$filename = $hash.$ext;
$save_dir = Typecho_Widget::widget('Widget_Options')->themeUrl.'/img/avatarcache/';
$base_dir = parse_url($save_dir,PHP_URL_PATH);
if (file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename) && (time() - filemtime($_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename)) < $ct){
$save_dir_x=parse_url($save_dir,PHP_URL_PATH); //取相对路径
return $save_dir_x.$filename;
}else if($switchav ='1' && strpos($emaill, '@qq.com') !== false){
$qmail = explode("@",$emaill);
$qqhao = $qmail[0];
$qqimg = 'http://q.qlogo.cn/headimg_dl?dst_uin='.$qqhao.'&spec=100';
$imgurl = get_remote_file($filename,$qqimg,$save_dir);
if ($imgurl){
$imgurl = parse_url($imgurl,PHP_URL_PATH);
sleep(2);
return $imgurl;
}
else {
$imgurl = get_avatar($filename,$hash,$size,$save_dir);
sleep(2);
return parse_url($imgurl,PHP_URL_PATH);
}
} else{
$imgurl = get_avatar($filename,$hash,$size,$save_dir);
sleep(2);
return parse_url($imgurl,PHP_URL_PATH);
}
}
/**
* Avatar 头像
*
*/
function get_avatar($filename,$hash,$size,$save_dir){
$default = Helper::options()->defaultavatar;
$realurl = Helper::options()->siteUrl;
$default = fullurl($default,$realurl);
$host = 'http://secure.gravatar.com/avatar/'; //CDN 目录
$rating = Helper::options()->commentsAvatarRating;
$avatarurl = $host . $hash . '?s=' . $size . '&r=' . $rating . '&d';
$avatartest = $host . $hash .'?d=404';
$test = get_headers($avatartest);
if ($test[0] == 'HTTP/1.1 200 OK') {
$imgurl = get_remote_file($filename,$avatarurl,$save_dir);
return $imgurl;
} else {
$base_dir = parse_url($save_dir,PHP_URL_PATH);
$cacheimg = $_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename;
copy($default,$cacheimg); //避免开一次页面就重新执行一次;
if (true) {
return $cacheimg;
} else{
return 'copy failed';
}
}
}
/**
* 下载远程文件
*
*/
function get_remote_file($filename,$url,$save_dir){
$ch=curl_init();
$timeout=3;
if(trim($save_dir)=='' || trim($filename)=='' || trim($url)==''){
return false;
} else {
$base_dir = parse_url($save_dir,PHP_URL_PATH);
set_time_limit (10);
$file = fopen($url, "rb");
if ($file) {
$newf = fopen ($_SERVER['DOCUMENT_ROOT'].'/'.$base_dir.$filename, "wb");
if ($newf) {
while (!feof($file)) { fwrite($newf, fread($file, 1024 * 8), 1024 * 8); }
}
}
if ($file) { fclose($file); }
if ($newf) { fclose($newf); }
if (true){ return $save_dir.$filename; } else{ return false; }
}
}
代码比较粗糙,但目的基本实现了,有更好方法的可以交流交流。
Windows 10Chrome 63.0.3239.132来自 贵州 的大神
不错!今天主题更新.......
Windows 10Maxthon 5.2.4.2000来自 山东 的大神
感谢分享,支持一下。
Windows 7搜狗浏览器 2.X来自 广东 的大神
保存不了远程图片哦。
学方法,不能直接套用,要用需要根据你网站实际配置来修改