-1

読み込みを高速化するためにGravatarアバターをキャッシュするにはどうすればよいですか?

現在、私は直接リンクを使用しています:
<img src="http://www.gravatar.com/avatar/' . md5( strtolower( trim( "privat@marktopper.dk" ) ) ) . '" alt="" class="comment-avatar"/>

4

2 に答える 2

3

サーバーで curl を使用して gravatar を取得し、自分でキャッシュすることもできますが、クライアント ブラウザーと同様に gravatar.com もそれらをキャッシュすることは確実なので、それほど多くは得られないと思います。

于 2012-10-04T19:09:25.753 に答える
2

グラバター画像をローカルにキャッシュする関数をいくつか書き留めました。例を参照してください。

テストする前に、この行$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

  • ?gravatar_email=some@mail.com を追加するだけで、URL に電子メールのパラメーターを渡すことができます

これは画像が保存される場所です:
http://simplestudio.rs/yard/gravatar/images/users/

それで、ロジックは何ですか?電子メール アドレスを介して gravatar を取得する関数を呼び出し、その gravatar が既にキャッシュされているかどうかを確認します。
そうでない場合は、ファイルをローカルに保存し、そのパスを返します。
既に保存されている場合は、そのファイルが 1 日より古いかどうかを確認し (これは関数パラメーター - 3 番目のパラメーターで構成可能)、古い場合は gravatar を更新し、そうでない場合は古いローカル ファイルを提供します。
また、関数を呼び出すときに、必要な gravatar のサイズを構成できます。テスト用に 64px を配置しました...
また、フェイルオーバー img 定義変数が$default_user_imgあり、ユーザーが gravatar を持っていない場合、ローカル フェイルオーバー img はデフォルトになります。持っていると常に良いです...

このようにグラバターから画像をキャッシュしておけば、長期的に見ると速くなると思います。
とにかく、ローカルにキャッシュされた画像があり、これは多くの理由で常に持っていると便利です...

  • 私はこれを書くのに少し時間をかけたので、それが役立つことを願っています:)
于 2012-10-04T21:46:56.747 に答える