`
dcj3sjt126com
  • 浏览: 1877751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP缓存Gravatar头像

    博客分类:
  • PHP
阅读更多

Gravatar为“全球通用头像”,多数前沿网站和博客程序都支持Gravatar头像,不过有时候Gravatar的网站会被墙(我相信很多人完全不理解这个网站为啥会享此“殊荣”),而且Gravatar在不同地区速度不一样会导致使用Gravatar头像的网站不稳定,尤其是国内的网站,缓存用户的头像到本地可以极大提高页面加载速度。

function getAvatar( $email, $expired=2592000 ){

    $str = md5($email);

    //CACHE_PATH是一个全局变量,设置缓存目录

    $file = CACHE_PATH . 'avatar/' . substr($str,0,2) . '/' . $str . '.jpg';

    $relativeFile = '/cache/avatar/' .substr($str,0,2) . '/' . $str . '.jpg';

    //如果头像不存在或者缓存过期,则重新获取

    if( !file_exists($file) && ( time()-filemtime($file)>$expired ) ){

        cacheAvatar($str);

    }

    //返回相对路径

    return $relativeFile;

}

     

function cacheAvatar( $str, $size=50, $time_out=1 ){

    $url = 'http://0.gravatar.com/avatar/'.$str.'?s='.$size;

    $path = CACHE_PATH . 'avatar/' . substr($str,0,2);

    $file = $path . '/' . $str . '.jpg';

    if( !is_dir($path) ){

        mkdir($path,0755,true);

    }

    $fp = fopen($file,'wb');

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);

    curl_setopt($ch, CURLOPT_FILE, $fp);

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    curl_exec($ch);

    curl_close($ch);

    fclose($fp);

}

 不使用curl也可以使用fopen打开远程图片然后保存到本地,不过curl可以设置超时,对于未知内容的抓取,要预防任何可能存在的不稳定因素。

function cacheAvatar( $str, $size=50, $time_out=1 ){
    $url = 'http://0.gravatar.com/avatar/'.$str.'?s='.$size;
    $path = CACHE_PATH . 'avatar/' . substr($str,0,2);
    $file = $path . '/' . $str . '.jpg';
    if( !is_dir($path) ){
        mkdir($path,0755,true);
    }
    $fp = fopen($url,'rb');
    if( $fp ){
        $newfp = fopen($file,'wb');
        if( $newfp ){
            while( !feof($fp) ){
                fwrite($newfp,fread($fp,8192),8192);
            }
        }
        if( $fp ){
            fclose($fp);
        }
        if( $newfp ){
            fclose($newfp);
        };
    }
}

 最后是后台对Gravatar头像进行批量删除和生成的操作方法:

class ReecCache extends ReecNode
{  
    public function __construct(){
        parent::__construct();
    }
     
    public function createAvatar(){
        //将会删除所有头像后重新生成
        $this->deleteAvatar();
        $sql = 'SELECT DISTINCT(comment_email) AS email FROM comments ORDER BY id ASC';
        $res = $this->db->getAll($sql);
        if( !empty($res) ){
            foreach( $res as $row ){
                cacheAvatar(md5($row['email']));
            }
        }
        echo "已重新生成全部头像缓存!\n";
    }
         
    public function deleteAvatar(){
        //将会删除所有头像
        foreach( glob(CACHE_PATH.'avatar/*') as $dir ){
            if( is_dir($dir) ){
                foreach( glob($dir.'/*.jpg') as $file ){
                    unlink($file);
                }
                rmdir($dir);
            }
        }
        echo "已删除全部头像缓存!\n";
    }
}

 

分享到:
评论

相关推荐

    Laravel开发-gravatar

    如果你需要更高级的功能,例如缓存Gravatar图片,可以自定义服务提供者,继承`GrahamCampbell\Gravatar\GravatarProvider`并覆盖其方法,然后注册你的服务提供者。 **6. 注意事项** - 为了保护用户隐私,不要直接...

    Laravel开发-gravatar .zip

    为了实现更高级的功能,比如缓存 Gravatar 图片,你可以利用 Laravel 的缓存系统。例如,可以在获取头像时将结果存储在 Redis 或 Memcached 中,减少不必要的网络请求。 此外,你还可以扩展 Gravatar 服务,添加...

    详解WordPress中的头像缓存和代理中的缓存更新方法

    总的来说,通过本地缓存Gravatar头像和管理代理服务器的缓存更新,可以显著提升WordPress网站的性能和用户体验。同时,正确地使用WordPress的脚本和样式表注册功能,能确保浏览器和代理服务器正确处理文件更新,保持...

    gravatar-php:用于生成Gravatar网址PHP库(gravatar.com)

    `gravatar-php` 是一个基于 PHP 的库,专门用于生成 Gravatar(全球统一头像服务)的URL。Gravatar 是一个服务,它允许用户通过他们的电子邮件地址关联一个头像,并在多个网站上显示该头像,例如在博客评论、论坛...

    GravatarServer:Typecho 的 Gravatar 插件

    3. **缓存机制**:为了提高性能和减少对 Gravatar 服务器的依赖,GravatarServer 插件通常会使用本地缓存来存储头像图片。这意味着即使在 Gravatar 服务不可用时,用户也能看到他们的头像。 4. **安全与隐私**:...

    mk-letter-avatar::A_button_(blood_type):WordPress字母头像插件(纯前端实现版)WordPress字母头像插件

    WordPress默认采用的是Gravatar头像,但很多人可能没有设置Gravatar头像,因此只能显示出替换的头像。本插件就是将无头像用户的头像显示成动态生成的昵称首字符头像。 说到字母头像,实际上之前已有多种方案。本...

    Laravel开发-lavatar

    在 `config/gravatar.php` 文件中,可以配置默认头像、大小、默认图片样式等参数。例如,设置默认头像为马赛克风格: ```php 'default_image' => 'wavatar', ``` 2. **获取头像 URL** 通过 `Gravatar` ...

    Avatars:读者墙头像缓存插件 for Typecho 1.1

    Typecho读者墙+头像缓存插件Avatars 2018年6月22日更新至v1.2.5: 更新模版钩子及国内镜像服务 修正action的安全校验等bug 增加tooltip效果支持css定制 详细说明与效果演示见blog发布地址:

    Emlog Time模版

    2.Gravatar全球通用图片调用 duoshuo多说的服务器缓存文件.防止主网站被强之后无法加载的问题,同时也解决了加载速度慢的问题 3.列表日志页面分2栏显示。如果大家想要一栏的,可以自己修改css参数就可以。直接更改...

    Laravel开发-avatar

    在Laravel框架中开发avatar功能,主要是为了提供一种方式来生成或显示用户的个性化头像,类似于Gravatar服务。Gravatar是一种全球通用的头像服务,它通过用户邮箱地址来关联和显示头像。然而,如果你想要在自己的...

    WordPress中利用AJAX异步获取评论用户头像的方法

    后台接收到请求后,会验证数据,然后调用WordPress内置的`get_avatar()`函数,该函数根据邮箱地址查找Gravatar服务(一个全球通用的头像服务)上的头像,并返回HTML代码。前端再将返回的HTML代码加载到页面中,显示...

    WP主题:HotNewspro 2.72

    主站加载Gravatar头像修改程序默认的服务器,或者启用头像缓存插件:推荐几款Gravatar头像缓存插件 ■ 如果想在文章列表中显示指定的摘要,可以在文章编辑页面下面的“摘要”中输入摘要内容,如无“摘要”项目,在...

    WP-Avatar-开源

    2. **兼容Gravatar**:与Gravatar服务无缝对接,如果用户已经在Gravatar上设置了头像,WP-Avatar会自动调用,无需额外操作。 3. **本地存储**:对于没有Gravatar账户或希望使用本地头像的用户,插件提供了本地存储...

Global site tag (gtag.js) - Google Analytics