如何缓存 gravatar 头像以加快加载速度?
目前我只是使用直接链接:
<img src="http://www.gravatar.com/avatar/' . md5( strtolower( trim( "privat@marktopper.dk" ) ) ) . '" alt="" class="comment-avatar"/>
如何缓存 gravatar 头像以加快加载速度?
目前我只是使用直接链接:
<img src="http://www.gravatar.com/avatar/' . md5( strtolower( trim( "privat@marktopper.dk" ) ) ) . '" alt="" class="comment-avatar"/>
你可以在你的服务器上使用 curl 来获取 gravatars 并自己缓存它们,但我确信 gravatar.com 也会缓存它们,客户端浏览器也是如此,所以我认为你不会获得太多。
我已经写下了一些在本地缓存 gravatar 图像的函数,请参见示例。
请在测试前将此行更改$gravatar_email = "default@email.com";为您的 gravatar 默认电子邮件。
此行也$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 的图像,从长远来看,它会更快。
无论如何,您将在本地缓存图像,这总是很好的,原因有很多......