2012-10-04 63 views
-1

如何緩存gravatar頭像以加快載入速度?如何緩存gravatar頭像?

目前我只使用一個直接鏈接:
<img src="http://www.gravatar.com/avatar/' . md5(strtolower(trim("[email protected]"))) . '" alt="" class="comment-avatar"/>

+4

gravatars是公開緩存,所以你的代碼看起來很好。 – hakre

+1

你正在從'gravatar.com'提供它們,這不是你的業務來緩存它們,它是他們的。我相信Gravatar已經做得很好。 – meagar

回答

3

你可以使用你的服務器上的捲曲得到gravatars和自己緩存他們,但我敢肯定,gravatar.com也將緩存它們,如同客戶端瀏覽器一樣,所以我認爲你不會獲得太多收益。

+0

這與gravatar沒什麼特別之處。不過,我可以想象,如果您獲得gravatar CDN網址/符號,您可以獲得收益。 – hakre

1

我已經寫下了一些本地緩存gravatar圖像的函數,請參閱示例。

請在測試之前將此行更改爲您的gravatar默認電子郵件地址$gravatar_email = "[email protected]";

此行也$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 = "[email protected]"; 

} 

$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天(這可以在函數參數 - 第三個參數中配置),如果它較舊,則更新gravatar,如果不是,則它會提供舊本地文件。
此外,當你調用函數,你可以配置什麼樣的大小的gravatar你需要,爲測試我把64px ...
還有一個失敗,img定義變量$default_user_img,如果用戶沒有gravatar那麼你的本地故障轉移img將是默認,總是很好有...

我認爲,如果你以這種方式從gravatar緩存圖像,它會更快,當你看長期。
反正你將有本地緩存​​的圖片這是一件好事,有許多原因......

  • 我把一些時間在書面方式這所以我希望它能幫助:)