0

0

什么是WordPress的Transients?临时数据怎么用?

月夜之吻

月夜之吻

发布时间:2025-08-19 19:44:01

|

892人浏览过

|

来源于php中文网

原创

wordpress transients通过设置过期时间的键值对缓存,减少数据库查询和api请求,提升网站性能,适用于缓存外部数据、复杂查询结果等场景,利用set_transient、get_transient和delete_transient函数管理缓存,相比option api更便捷,避免手动管理过期逻辑,配合外部缓存如redis可进一步提升效率。

什么是wordpress的transients?临时数据怎么用?

WordPress Transients是一种用于临时存储带有时效性数据的轻量级缓存机制,它能有效减少不必要的数据库查询或外部API请求,从而显著提升网站的运行速度和响应性能。它本质上就是一种键值对存储,但关键在于其数据具有明确的过期时间,到期后会自动失效。

Transients在我看来,是WordPress性能优化工具箱里不可或缺的一件利器。它的核心理念就是“用一点点存储空间,换来大大的时间节省”。那些不经常变化但又被频繁访问的数据,我们完全可以先把它存起来,下次再需要的时候,直接从缓存里拿,省去了重新计算、查询数据库或者请求外部API的开销。

具体到怎么操作,WordPress提供了三个核心函数来管理Transients:

set_transient()
get_transient()
delete_transient()

set_transient( $transient, $value, $expiration )
: 这个函数用来创建或更新一个Transient。

  • $transient
    :这是你给这个缓存数据起的名字,必须是唯一的。
  • $value
    :你想缓存的数据,可以是任何PHP支持的类型,比如字符串、数组、对象等,WordPress会负责它们的序列化和反序列化。
  • $expiration
    :这是它的“保质期”,以秒为单位。这是Transients与普通选项(Options)最大的不同。比如,如果你想缓存一个小时,就写
    HOUR_IN_SECONDS
    或者
    3600
    。如果设置为
    0
    ,则表示立即过期,这在某些测试场景下会比较有用。

举个实际的例子,假设你的网站需要展示某个外部API提供的用户头像列表,这个列表可能一天才更新一次,但你的页面每次加载都需要它。如果每次都去请求API,那网站速度肯定受影响,还可能被API服务商限制请求频率。这时候,Transients就派上用场了:

function get_user_avatars_cached() {
    // 尝试从缓存中获取头像数据
    $avatars = get_transient( 'my_user_avatars_list' );

    // 如果缓存不存在或者已经过期
    if ( false === $avatars ) {
        // 实际去外部API获取数据
        $response = wp_remote_get( 'https://api.example.com/avatars' );
        if ( is_wp_error( $response ) ) {
            // 错误处理,返回空数组或者默认值
            return array();
        }
        $body = wp_remote_retrieve_body( $response );
        $avatars = json_decode( $body, true );

        // 将获取到的数据存入缓存,设置过期时间为1小时
        set_transient( 'my_user_avatars_list', $avatars, HOUR_IN_SECONDS );
    }

    return $avatars;
}

get_transient( $transient )
: 这个函数用来获取缓存的数据。

  • $transient
    :你要获取的缓存数据的键名。 如果缓存存在且未过期,它会返回存储的值;如果缓存不存在或已经过期,则返回
    false
    。上面例子中的
    if ( false === $avatars )
    就是基于这个返回值来判断是否需要重新获取数据。

delete_transient( $transient )
: 这个函数用来手动删除一个缓存数据。

  • $transient
    :你要删除的缓存数据的键名。 当你需要强制刷新缓存,或者某个数据不再需要缓存时,就可以调用这个函数。比如,如果用户更新了头像,你可能需要立即清除之前缓存的头像列表,确保下次访问时能显示最新的数据。
// 假设用户资料更新时需要清除头像缓存
add_action( 'profile_update', 'clear_cached_avatars_on_profile_update' );
function clear_cached_avatars_on_profile_update( $user_id ) {
    // 清除之前设置的头像列表缓存
    delete_transient( 'my_user_avatars_list' );
}

值得一提的是,Transients默认情况下是存储在WordPress的

wp_options
表里的。这意味着每次读写都会涉及到数据库操作。虽然比直接查询业务数据快,但如果你的Transients非常多或者读写频率极高,这本身也可能成为瓶颈。这也是为什么,当你的WordPress网站流量和数据量达到一定规模后,通常会推荐配置Memcached或Redis这类外部对象缓存,它们能让Transients的读写速度飙升,因为数据直接在内存中处理。

为什么选择Transients而不是Option API或自定义表?

这是一个非常实际的问题,我在做项目的时候也经常会权衡。Transients和Option API(

add_option
,
get_option
,
update_option
)看起来都是键值对存储,但它们的核心差异在于“过期时间”。Option API存储的数据是持久化的,除非你手动删除,否则它会一直存在。这意味着如果你用Option API来存临时数据,你就得自己编写一套复杂的逻辑来判断数据是否过期,然后手动更新或删除,这无疑增加了代码的复杂性和维护负担。

Transients则天生自带“保质期”属性,到期了就自动失效,

get_transient()
会返回
false
,从而触发你重新生成数据的逻辑。这大大简化了缓存的管理工作。

至于自定义表,那更是“重量级”的解决方案了。自定义表通常用于存储大量结构化的、需要复杂查询和关联的数据,比如订单、产品、用户自定义内容等。为了存几个简单的临时数据就去建一个新表,简直是杀鸡用牛刀,而且还会增加数据库的负担,因为每次查询都需要额外的表连接和索引查找。Transients轻量得多,它就是为了快速存取小块的、有时效性的数据而设计的。

当然,也有特殊情况。如果你的“临时数据”实际上非常庞大,或者需要非常复杂的索引和查询,那么Transients可能就不太合适了,因为它不是为这种场景设计的。这时可能就需要考虑自定义表,或者更高级的NoSQL数据库方案。但对于大部分网站性能优化中的缓存需求,Transients是首选。

Transients在哪些场景下能发挥最大作用?

Transients简直是为那些“变动不频繁但访问量巨大”的数据而生的。我脑子里立刻蹦出几个典型的应用场景:

  1. 外部API数据缓存:这是最普遍的用法。比如,你的网站需要展示GitHub项目的Star数量、Twitter的最新推文、实时汇率、天气预报等等。这些数据不是秒级变化的,但用户每次访问页面都去请求外部API,不仅会拖慢页面加载速度,还可能因为请求频率过高而被API服务商限制。用Transients把这些数据缓存几分钟到几小时,用户体验会显著提升。

    PHP开发实用指南 2.0
    PHP开发实用指南 2.0

    对于一个刚进入PHP 开发大门的程序员,最需要的就是一本实用的开发参考书,而不仅仅是各种快速入门的only hello wold。在开发的时候,也要注意到许多技巧和一些“潜规则”。PHP是一门很简单的脚本语言,但是用好它,也要下功夫的。同时,由于PHP 的特性,我一再强调,最NB 的PHP 程序员都不是搞PHP 的。为什么呢?因为PHP 作为一种胶水语言,用于粘合后端 数据库和前端页面,更多需

    下载
    // 示例:缓存GitHub项目Star数量
    function get_github_stars_cached( $repo_slug ) {
        $cache_key = 'github_stars_' . sanitize_key( $repo_slug ); // 确保键名安全
        $stars = get_transient( $cache_key );
    
        if ( false === $stars ) {
            // 缓存不存在或已过期,去GitHub API获取数据
            $response = wp_remote_get( "https://api.github.com/repos/{$repo_slug}" );
            if ( is_wp_error( $response ) ) {
                return 'N/A'; // 错误处理
            }
            $data = json_decode( wp_remote_retrieve_body( $response ), true );
            $stars = isset( $data['stargazers_count'] ) ? $data['stargazers_count'] : 'N/A';
    
            set_transient( $cache_key, $stars, HOUR_IN_SECONDS * 12 ); // 缓存12小时,避免过于频繁请求
        }
        return $stars;
    }
  2. 复杂数据库查询结果缓存:有些页面可能需要执行非常复杂的数据库查询,比如统计分析数据、生成热门文章列表、或者一个包含大量联表操作的自定义报告。这些查询本身就耗时,如果每次页面加载都重新执行,数据库压力会很大。把查询结果缓存起来,即使是几分钟的缓存,也能显著减轻数据库负担。

  3. 耗时运算结果缓存:网站上可能有一些计算量比较大的操作,比如生成一个特定尺寸的图片列表、处理一段富文本内容以适应不同显示需求、或者执行一些机器学习模型的轻量级预测。这些运算结果也可以通过Transients缓存,避免重复计算。

  4. RSS Feed 或其他外部内容源:如果你从其他网站拉取RSS Feed来展示,Transients能很好地解决频繁请求和数据过期的问题。

核心原则就是:如果一个数据生成成本高(无论是时间还是计算资源),且在一定时间内变化不大,那么它就是Transients的理想候选。但也要注意,如果数据需要实时更新,或者数据量非常巨大,Transients可能就不是最佳方案了。

如何处理Transients的过期和失效问题?

Transients的过期机制虽然方便,但实际使用中还是会遇到一些“小麻烦”,或者说需要我们额外注意的地方。

首先,自动过期是Transients的基石。当你设置了过期时间,WordPress会负责在后台检查并标记过期数据。但这里有个小细节:Transients并不是到点就“砰”地一下从数据库里消失。当

get_transient()
被调用时,如果它发现数据已经过期,它会返回
false
,并且在某些情况下(取决于WordPress版本和是否使用外部对象缓存)会触发清理过期数据的操作。所以,即便数据过期了,它可能还在
wp_options
表里躺着,直到下次访问或WordPress的垃圾回收机制清理它。这通常不是大问题,但了解一下有助于理解其工作原理。

其次,手动失效。虽然有自动过期,但很多时候我们希望在特定事件发生时强制让Transients失效,而不是等到它自然过期。这就是

delete_transient()
的用武之地。比如,你缓存了某个用户的个人资料信息,当这个用户更新了他的资料时,你肯定希望立即清除旧缓存,让网站显示最新数据。这时候,你可以在用户资料更新的钩子(如
profile_update
)里调用
delete_transient()

一个常见的挑战是,当你缓存了多个相关联的数据,或者缓存的键名是动态生成的(比如基于文章ID),那么在需要清除缓存时,你可能需要知道所有相关的键名才能逐一删除。如果键名是可预测的,这还好办;如果不是,你可能需要设计一个更复杂的缓存失效策略,比如使用一个主键来管理一组相关的Transients,或者干脆清除所有与某个模块相关的Transients(尽管这种“一刀切”的方式通常不推荐,因为它可能影响其他不相关的缓存)。

最后,缓存击穿与雪崩

  • 缓存击穿:当一个非常热门的Transients过期瞬间,大量请求同时涌入,都会发现缓存
    false
    ,然后同时去源头(数据库或API)获取数据,这可能会瞬间压垮源头。一种常见的应对策略是使用单点更新锁机制。例如,只有第一个发现缓存过期的请求去重新生成数据,其他请求等待或使用旧数据(如果可以接受)。WordPress本身没有内置的Transients锁,但你可以通过其他方式实现,比如使用
    wp_cache_add
    或自定义数据库锁。
  • 缓存雪崩:如果你的大量Transients都在同一时间过期,那也会导致类似缓存击穿的问题,只不过是范围更广。避免这种情况的方法是给Transients设置错峰过期时间。比如,不是所有缓存都设成
    HOUR_IN_SECONDS
    ,可以随机加减几分钟,让它们在不同时间点过期。
// 示例:错峰过期,避免缓存雪崩
set_transient( 'my_data_item', $value, HOUR_IN_SECONDS + mt_rand( 0, 300 ) ); // 随机增加0-5分钟

这些细节虽然看起来有点“技术宅”的范儿,但实际开发中,尤其是在高流量网站上,它们决定了你的缓存策略是“神来之笔”还是“埋雷”。Transients很棒,但用好它,也需要一点点经验和对系统行为的理解。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

192

2025.07.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 7.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号