如何缓存gravatar头像以加快加载速度?
目前我只使用直接链接:
<img src="http://www.gravatar.com/avatar/' . md5( strtolower( trim( "privat@marktopper.dk" ) ) ) . '" alt="" class="comment-avatar"/>
答案 0 :(得分:3)
您可以在服务器上使用curl来获取gravatars并自己缓存它们,但我确信gravatar.com也会缓存它们,就像客户端浏览器一样,所以我认为你不会获得太多收益。
答案 1 :(得分:1)
我已经写下了一些在本地缓存gravatar图像的函数,请参阅示例。
请在测试前将此行$gravatar_email = "default@email.com";
更改为您的简历默认电子邮件。
此行也$your_domain = "http://www.simplestudio.rs";
到您的域名。
此行$local_file = "images/users/" . $email . "." . $type;
到您的本地路径。
<?php
function img_type($get_img) {
$type_img = explode("\n", $get_img);
$type_img = $type_img[0];
$type_img = strtolower($type_img);
$type_img = preg_replace("/[^A-Za-z0-9]/","",$type_img);
$ftypes = array("png","jpg","jpeg","gif","bmp");
$ftype = "";
foreach($ftypes as $ft) {
$locate_type = strpos($type_img, $ft);
if($locate_type > -1) {
$ftype = $ft;
break;
}
}
return $ftype;
}
function user_img($email, $size, $days_to_cache) {
$email = strtolower(trim($email));
$your_domain = "http://www.simplestudio.rs";
$default_user_img = $your_domain . "/yard/gravatar/images/users/default_user.png";
$gravatar_img = "http://www.gravatar.com/avatar/" . md5($email) . "?s=" . $size . "&d=" . $default_user_img;
$now_day = date("Ymd");
global $now_minus_one;
$period_to_chk = " -" . $days_to_cache . " day";
$now_minus_one = date('Ymd', strtotime($now_day . $period_to_chk));
$get_img = file_get_contents($gravatar_img);
$type = img_type($get_img);
$local_file = "images/users/" . $email . "." . $type;
if (file_exists($local_file)) {
global $file_date;
$file_date = date("Ymd", filemtime($local_file));
if($now_minus_one >= $file_date) {
$get_img = file_get_contents($gravatar_img);
$open_file = fopen($local_file, 'w') or die("can't open file");
$data = $get_img;
fwrite($open_file, $data);
fclose($open_file);
$user_img = $local_file;
}
else {
$user_img = $local_file;
}
}
else {
$open_file = fopen($local_file, 'w') or die("can't open file");
$data = $get_img;
fwrite($open_file, $data);
fclose($open_file);
$user_img = $local_file;
}
return $user_img;
}
if(isset($_REQUEST['gravatar_email'])) {
$gravatar_email = $_REQUEST['gravatar_email'];
}
else {
$gravatar_email = "default@email.com";
}
$img = user_img($gravatar_email, "64", "1");
?>
<html>
<head>
</head>
<body>
<img src="<?php print $img; ?>" alt="" class="comment-avatar"/>
</body>
</html>
这里有效:
http://simplestudio.rs/yard/gravatar/gravatar.php
这是保存图像的地方:
http://simplestudio.rs/yard/gravatar/images/users/
那么逻辑是什么?
您通过电子邮件地址调用获取gravatar的函数,并检查该gravatar是否已缓存
如果不是,只需在本地保存文件并将该路径返回给您
如果它已经保存,它会检查该文件是否比1天更早(这可在功能参数中配置 - 第3个参数),如果它更旧,则更新gravatar,如果不是旧的本地文件。
此外,当你调用该功能时,你可以配置你需要多大的gravatar,为测试我把64px ...
还有一个故障转移img定义的变量$default_user_img
,如果用户没有gravatar,那么你的本地故障转移img将是默认值,总是很好...
我认为如果你以这种方式缓存来自gravatar的图像,那么当你长期看时它会更快 无论如何,你将在本地缓存图像,这有很多原因...