Typecho——非插件方式实现QQ和Gravatar缓存到本地

简介: Typecho——非插件方式实现QQ和Gravatar缓存到本地

前言

EasyBe终于差不多可以收尾了,EasyBe希望大家多多star和issue;

体验https://oyo.cool/ | https://wangyangyang.vip/ | https://easybe.org/ [亚太地区的服务器暂时关闭了,cnmae转发不行会被拦截]

内容

其实还可以稍微优化下,比如将缓存时间也作为配置来;

functions.php

/**
*主题配置
*/
function themeConfig() {
   // 设置gravatar的镜像服务器
   $gravatarPrefix = new Typecho_Widget_Helper_Form_Element_Radio('gravatarPrefix', array(
        'https://gravatar.loli.net/avatar/' => 'LOLI镜像 <small>https://gravatar.loli.net</small>',
        'https://gravatar.cat.net/avatar/' => 'CAT镜像 <small>https://gravatar.cat.net</small>',
        'https://sdn.geekzu.org/avatar/' => '极客镜像 <small>https://sdn.geekzu.org</small>',
        'https://dn-qiniu-avatar.qbox.me/avatar/' => '七牛镜像 <small>https://dn-qiniu-avatar.qbox.me</small>',
        ),
        'https://gravatar.loli.net/avatar/', _t('Gravatar镜像'), _t('Gravatar镜像服务器'));
    $form->addInput($gravatarPrefix->multiMode());
    // 设置加盐参数
    $salt = new Typecho_Widget_Helper_Form_Element_Text('salt', NULL, 'easybe', _t('加密参数'), _t('头像加密参数建议修改'));
    $form->addInput($salt);
}
/**
 * 获取本地头像
 * @param string $email 邮箱地址
 * @return string 返回头像链接
 */
function getAvatar(string $email) {
        $options = Helper::options();
        // 默认缓存15天
        $time = 1296000;
        $gravatarUrl = $options->gravatarPrefix.md5(strtolower(trim($email))).'?s=100&r=G';
        $qqNumber = preg_match('/@qq.com/', $email) ?  explode('@', $email)[0] : '';
        $fileUrl = $qqNumber ? "https://q.qlogo.cn/headimg_dl?dst_uin={$qqNumber}&spec=100&img_type=jpg" : $gravatarUrl;
        $filePath = '/usr/uploads/avatar/'.md5(strtolower(trim($email.$options->salt))).'.jpg';
        $fileInfo = __TYPECHO_ROOT_DIR__.$filePath;
        $dirPath = dirname($fileInfo);
        if (!is_dir($dirPath)) mkdir($dirPath, 0755);
        if (file_exists($fileInfo) && (time() - filemtime($fileInfo)) < $time) {
            echo $options->siteUrl.$filePath;
        } else if (file_put_contents($fileInfo,file_get_contents($fileUrl))) { 
            echo $options->siteUrl.$filePath;
        }
}

comments.php

<?php
function threadedComments($comments, $options){
    $commentClass = '';
    if ($comments->authorId) {
        if ($comments->authorId == $comments->ownerId) {
            $commentClass .= ' comment-by-author';  //如果是文章作者的评论添加 .comment-by-author 样式
        } else {
            $commentClass .= ' comment-by-user';  //如果是评论作者的添加 .comment-by-user 样式
        }
    }
    $commentLevelClass = $comments->_levels > 0 ? ' comment-child' : ' comment-parent';  //评论层数大于0为子级,否则是父级
    ?>
    <li id="li-<?php $comments->theId(); ?>" class="comment-body<?php
    if ($comments->levels > 0) {
        echo ' comment-child';
        $comments->levelsAlt(' comment-level-odd', ' comment-level-even');
    } else {
        echo ' comment-parent';
    }
    $comments->alt(' comment-odd', ' comment-even');
    echo $commentClass;
    ?>">
        <div class="feedbackItem" id="<?php $comments->theId(); ?>">
            <div class="feedbackListSubtitle">
                <div class="feedbackManage">
                <span class="comment_actions">
                    <?php $comments->reply(); ?>
                </span>
                </div>
                <a href="javascript:void(0);" class="layer">#<?php $comments->sequence(); ?>楼</a>
                <?php if ($comments->authorId) {
                    if ($comments->authorId == $comments->ownerId) {
                        echo "<span class='louzhu'>[楼主]</span>";
                    } ?>
                <?php } ?>
                <span class="comment_date"><?php $comments->date('Y-m-d H:i'); ?></span>
                <a id="a_comment_author_<?php $comments->sequence(); ?>" href="<?php $comments->permalink(); ?>"><?php $comments->author(); ?></a>
                <span id="device_comment_<?php $comments->sequence(); ?>" >
                    <?php $data = getBrowsersInfo($comments->agent); ?>
                    <span><?php echo $data['system']; ?> <?php echo $data['systemVersion']; ?></span>
                    <span><?php echo $data['browser']; ?> <?php echo $data['version']; ?> </span>
                </span>
                <span id="ip_comment_<?php $comments->sequence(); ?>" ><?php getIPInfo($comments->ip) ?></span>
            </div>
            <div class="feedbackCon">
                <div id="comment_body_<?php $comments->sequence(); ?>" class="blog_comment_body cnblogs-markdown">
                    <p>
                        <a><?php echo getPermalinkFromCoId($comments->parent); ?></a>
                        <br><?php $comments->content(); ?>
                    </p>
                </div>
                <div class="comment_vote">
                    <span class="comment_error" style="color: red"></span>
                </div>
                <span id="comment_<?php $comments->sequence(); ?>_avatar" style="display:none">
                    <img  src="<?php getAvatar($comments->mail) ?>" alt='avatar' >
                </span>
            </div>
        </div>
        <?php if ($comments->children) { ?>
            <?php $comments->threadedComments($options); ?>
        <?php } ?>
    </li>
<?php } ?>

学无止境,谦卑而行.

目录
相关文章
|
存储 缓存 NoSQL
为你的Typecho使用Redis缓存,优化访问速度-织音博客
前言 Typecho虽然轻量,但终究仍是PHP动态脚本,访问时需要频繁调取数据库的信息,导致并发值一高,CPU就100%占用,无法处理新的请求信息。这时,我们可以用Redis来设置缓存,从而不用频繁调动数据库,来达到加速访问的目的。注意:Redis仅支持 Linux 系统,如果你是Windows系统,可考虑其他软件。 Redis介绍 Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的api。 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 不仅仅支持简单的key-value类型
257 0
为你的Typecho使用Redis缓存,优化访问速度-织音博客
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
112 1
|
11天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
152 85
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
53 2
数据的存储--Redis缓存存储(二)
|
3月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
84 6
|
9天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
2月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
2月前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
2月前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
314 22
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
44 5