摘要 最后修改:2020年8月18日阅读时间:观点网站的性能通常围绕缓存的概念展开:将数据存储在就绪且可快速访问的状态下,以便浏览器更快地复制它。WordPressTransientsAPI是用于缓存的工具,以及一种提高WordPress网站性能的强大方法。每当浏览器请求网页时,服务服务器必须进行许多复杂且耗时的计算,导致延误。执行查询后,得益于缓
自动删除
手动删除
远程API响应
本地API响应
基本用法
基本范例
更复杂的例子
目录
最后修改: 2020年8月18日
阅读时间:
观点
网站的性能通常围绕缓存的概念展开:将数据存储在就绪且可快速访问的状态下, 以便浏览器更快地复制它。 WordPress Transients API是用于缓存的工具, 以及一种提高WordPress网站性能的强大方法。
每当浏览器请求网页时, 服务服务器必须进行许多复杂且耗时的计算, 导致延误。 执行查询后, 得益于缓存技术, 服务器可以记住最终结果,并且在第二次请求时, 将其提供给浏览器,而无需再次进行相同的计算。 所以, 缓存和重用早期资源的能力对于优化性能至关重要。
非常简单的缓存提供了将信息临时存储在缓存层中的选项。
缓存有不同的类型,结合使用它们, 您将获得更高的性能水平。
在打开网页内容之前, 您的浏览器需要一堆东西,例如JavaScript文件, 样式表, 字体, 等等 除了页面内容外,它还会下载所有这些内容。
如果浏览器缓存了这些文件, 每次加载网站时都无需下载它们。 首次加载该网站通常需要几秒钟, 但是在浏览器缓存了这些文件之后, 加载时间大大减少。
服务器缓存是指为特定页面保存HTML文件,并在随后的每个请求中使用。 这就是所谓的全页缓存。
服务器缓存还有另一种类型-对象缓存, 哪个, 与全页缓存不同, 仅缓存某些信息(片段)。
被认为是最有效的缓存。 它的名称对它的工作方式不言而喻。 当用户“ A”访问网页时, 网站将对其进行构建,并将其内容返回给用户的浏览器。 在页面缓存运行的情况下, 保存此页面内容,以便当用户“ B”访问同一页面时, 页面缓存会重现以前发送的内容。
页面缓存的最大优点是,缓存的页面几乎在访问时返回。 因此, 即使在性能最差,CPU使用率最低的最弱服务器上,也要处理数百万个请求并重现页面。
但是这种类型的缓存也有其缺点:例如, 无法为授权用户缓存页面, 或针对其页面内容取决于当前用户变量的用户。
数据库缓存是计算机应用程序设计中包含的过程,该过程通过访问后端数据库按需(动态)生成网页。 数据库缓存通过消除不必要的压力来增强主数据库, 通常以经常访问的读取数据的形式。 缓存本身可以在多个区域中运行,包括您的数据库, 应用程序或作为独立层。
当这些应用程序部署在涉及基于浏览器的客户端的多层环境中时, Web应用程序服务器和后端数据库, 中间层数据库缓存用于实现高可伸缩性和性能。
WordPress中的对象缓存(对象缓存)涉及存储数据库查询。 它是一种内置的系统机制,可让您保存任何类型的数据(对象)并在必要时进行检索。 该缓存用于存储复杂操作的结果。
在您的WordPress网站上启用后, 它有助于加快PHP执行时间, 更快地向网站访问者提供内容, 并减少数据库的负载。
它是一个地理上分散的网络基础结构,可向Web服务和站点的用户提供快速的内容交付。 CDN中包含的服务器在地理位置上以使站点/服务用户的响应时间最小的方式定位。
瞬态API是存储信息块(代码串, HTML内容 WP_Query对象, 网站的数据库中的JSON),而不是浏览器缓存。 Transients API与Options API非常相似, 但主要区别在于Transients API 有到期时间 或更好的说寿命。
瞬态的三个主要操作是 设定值, 获得价值 和删除值 :
set_transient($ key, $ value, $ expires);
要设置瞬态,可以使用set_transient()函数,该函数包含三个组件:
钥匙 –瞬态的短唯一名称。 长度不得超过172个字符。
价值 –包含将存储在数据库中的信息的任何类型的PHP变量。
到期时间(寿命)– 信息将存储的时间量。
因此,例如,如果我们要保存一天的列表帖子查询,请执行以下操作:
set_transient('unique_listing_posts_query_results_name',
$ listing_posts_query_results, DAY_IN_SECONDS);
如您所见,我们使用了WordPress 3中引入的几种(DAY_IN_SECONDS)时间常数。5,轻松表达时间。 这是所有时间常数的完整列表:
MINUTE_IN_SECONDS= 60(秒)
HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS
MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
get_transient($ key);
为了获得一个保存的瞬态,我们可以使用
get_transient($ transient_name);
在我们的情况下,我们可以通过以下方式获取列出查询结果的帖子:
get_transient( 'unique_listing_posts_query_results_name' );
在后面的示例部分中,我们将对此进行详细介绍。
delete_transient($ key);
正如我们在前面的小节中所解释的,我们可以使用Transients API来获取和存储对数据库的远程或本地(内容或来自数据库的查询)响应。
然而, 这是一个问题 我们如何删除旧的存储内容(瞬态)。 有两种清除(删除)瞬态的方法:
自动删除
关于瞬态的很酷的事情是,如果我们 设置到期时间(寿命) 。 如果您试图在瞬态过期后从数据库中检索瞬态, WordPress会自动将其删除, 防止任何混乱。一旦有人打开网站,瞬态将被重新创建。 这样,我们可以确保从远程或本地API获得新鲜的内容。
手动删除
有时,我们需要通过手动删除瞬变来强制其过早死亡。 在进行给定活动(添加新菜单项, 保存或更新帖子, 添加或更新类别等)将使缓存的数据本来就过时并且需要更新:
我们必须使用的功能是
delete_transient($ transient_name)
在我们的情况下应该是:
delete_transient( 'unique_listing_posts_query_results_name' );
笔记: 重要的是不要使用瞬态来存储无法重新创建的有价值的数据!
只要我们的计算密集型值不经常更改并且想要缓存,就可以使用Transients API。 在WordPress中, 这通常是数据库查询的结果对象, 但实际上可以是您存储在变量中的任何内容, 是否为标量值, 数组或对象。
因此,当您在主题和插件中执行复杂的查询时,所有瞬变都是很棒的。
远程API响应
远程API始终会对远程服务器进行多次调用或请求,并且存在一些额外的延迟。 这会花费时间并导致延迟。 还, 一些远程API可能有速率限制, 表示您可以在给定的时间内达到最大请求数限制。
如您所知, 我们可以利用Transients API来缓存来自远程服务器的响应(结果)并将其存储在我们的数据库中。 现在我们可以使用
get_transient();
方法,并在需要时显示存储的(缓存的)结果/内容,而无需进行其他远程调用或请求。
所有这些将:
减少远程HTTPS调用和请求
减少CPU服务器使用率
缩短网站页面加载时间
本地API响应
–基本上是数据库的HTML或查询结果。 您不仅可以将Transients API用于缓存远程响应,还可以将HTML内容或查询结果存储在本地数据库中。 如果您想在网站上显示可重复的HTML部分(小部件, 滑块, 菜单 等等。),或者只是为了防止每次有人访问您的网站时触发复杂或缓慢的数据库查询。
复杂和自定义的数据库查询
WordPress导航菜单
侧栏小部件,显示信息,例如; 鸣叫, 最近的网站访问者列表或特定类别的帖子列表
缓存标签云
缓存外部HTTP请求
经过如此多的解释,现在该是一个真实的例子了。
基本用法
函数get_my_data(){
$ data = get_transient('my_transient_name');
if(false === $ data){//瞬态已过期/尚未设置
$ data = fetch_my_data(); //从原始来源提取数据
set_transient('my_transient_name', $ data, HOUR_IN_SECONDS);
}
返回$ data;
}
fetch_my_data() 功能可以存储 WP_Query对象, json数据, html内容 , 等等。
基本范例
正如我们已经解释的那样,这种类型的缓存非常适合保存长时间操作的结果, 最简单的示例是访问外部API, 例如Facebook。
假设我们具有以下功能, 可以访问Facebook API, 请求一个对象(更确切地说, 页面)您的网站。url并返回该页面的点赞次数:
function get_facebook_likes() {
$ result = wp_remote_get('https:// graph。Facebook。com /您的网站。url');
$ result = json_decode(wp_remote_retrieve_body($ result));
返回$ result->喜欢
}
回显“ Facebook喜欢:”。 get_facebook_likes();
此函数的执行时间取决于许多因素, 包括您的服务器相对于Facebook服务器的位置, 状态, 和网络的速度, 等等。 一般, 一个功能可能需要1-3秒。
这意味着在网站上使用此功能时, 每页的加载时间将增加1-3秒。 而且, 如果我们在500秒内调用此函数500次以上, Facebook将开始生成错误而不是结果。
为了加快此功能, 我们可以使用WordPress Transients API并将结果保存1小时:
function get_facebook_likes() {
if ( false===( $likes=get_transient( 'fb_likes' ) ) ) {
$ result = wp_remote_get('https:// graph。Facebook。com /您的网站。url');
$ result = json_decode(wp_remote_retrieve_body($ result));
$ likes = $ result->喜欢
//将瞬态设置为一个小时(以秒为单位)
set_transient('fb_likes', $赞, 1 * HOUR_IN_SECONDS);
}
返回$ likes;
}
因此, 第一次调用此函数时, 收到Facebook的请求后, WordPress会将结果写入数据库,将来将在一个小时内从数据库返回此结果,而无需向Facebook服务器重复请求。 一个小时后, 该功能将再次转到Facebook获取数据。
通过这种方法, 每小时只有一次对此功能的调用将使请求时间增加1-3秒, 随后的电话将立即发出。
更复杂的例子
想象一下,我们有一个包含大约100个类别和大约50000个帖子的网站, 在网站的单个帖子设计中,我们有一个小部件,可显示当前帖子所在类别中的N个相关帖子。 不出所料 这个复杂的查询需要一些时间才能从数据库中获取结果并将其显示在网站上。
现在,假设您有10,000个用户同时访问该网站。 这意味着我们将有10,000多个数据库请求必须执行查询(这是一个复杂的查询,因为它将搜索整个数据库wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts表 , 因此他们有超过1万个查询), 从相关类别中获取N条帖子的结果,并将其显示在前端。 这, 反过来, 会使数据库超载并延迟网站的整体加载时间, 在某些情况下,甚至由于数据库超载而使它崩溃。
接下来的问题是如何优化和减少数据库查询和请求的数量。 为什么每次我们都可以利用Transients API并仅缓存查询对象或缓存整个HTML输出时,都有这么多查询? 这样,我们将减少和优化数据库查询的数量, 这将带来更好的网站性能和更好的用户体验。
在我们的情况下,查询将在 wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts表 获得所有预期的结果。
这是我们如何完成此操作的完整示例:
function show_posts_from_category() {
$ args = array(
'猫'=> 555, //随机类别ID
'posts_per_page'=> 8, //随机显示相关帖子
'No_found_rows'=> 真的,
);
$hash=md5( $args['cat'] ); //类别ID的MD5哈希
$ transient_key ='category-'。 $ hash; //瞬态键
if(false ===(($ posts_from_category_html = get_transient($ transient_key))))://瞬变已过期/尚未设置
$ the_query =新的WP_Query($ args); //获取查询
ob_start(); //打开输出缓冲
而($ the_query->have_posts()):$ the_query->the_post();
?>
div class =“ item”>
div class =“ bigthumb”>
href =“ https:// devrix。com / tutorial / transients-api /?PHP的the_permalink();?>“ rel =” bookmark“ title =”?PHP的the_title();?>”> ?PHP的如果(has_post_thumbnail())the_post_thumbnail('big-thumb');?>/一种>
/ div>
33>href =“ https:// devrix。com / tutorial / transients-api /?PHP的the_permalink();?>“ rel =” bookmark“ title =”?PHP的the_title();?>”>?PHP的the_title();?>/一种>/小时3>
?PHP的the_excerpt();?>
/ div>
?的PHP
结束
$ post_from_category_html = ob_get_contents(); //获取输出缓冲区的内容而不清除它
ob_end_clean(); //关闭此输出缓冲
set_transient($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); //将瞬态设置为15分钟的到期时间
wp_reset_postdata();
万一;
返回$ post_from_category_html;
}
缓存是加快处理速度的好方法, 但您必须确切知道要缓存的内容, 在哪里可以做, 何时何地, 否则,您将面临面临意外后果的风险。
如果您不确定某项功能是否按预期工作, 总是转向分析-查看针对数据库的每个查询, 查看所有PHP函数调用, 时间和内存使用情况。
Transients API是优化WordPress网站的加载时间并提供出色的用户体验的好方法。 在插件和主题中使用瞬态很简单,仅增加了几行代码。 如果在正确的情况下(例如长数据库查询或复杂的处理数据)使用它,可以节省站点上的加载时间几秒钟。
DevriX是一家提供全方位服务的WordPress开发机构。 我们不仅提供Web开发服务,而且还提供专家团队,可以为您建立在线形象的每个步骤提供建议。
浏览更多:开发WordPress开发
Vladislav是DevriX的后端开发人员,并且是WordPress核心贡献者。 他拥有10多年的开发经验,但每天都在努力应对新挑战,以提高自己的开发技能。 在他空闲的时候, 他跟随他最喜欢的电视连续剧, 与朋友一起踢足球,并与家人共度时光。