什么是瞬态API?
已发表: 2020-12-16网站性能通常围绕缓存的思想:以就绪状态且访问速度更快的状态存储数据,以便浏览器更快地复制数据。 WordPress Transients API是一种缓存工具,是一种提高WordPress网站性能的强大方法。
什么是缓存,为什么要使用它?
每当浏览器请求网页时,服务服务器都必须执行许多复杂且耗时的计算,这会导致延迟。 执行查询后,借助缓存技术,服务器可以记住最终结果,并在第二次请求时将其提供给浏览器,而无需再次进行相同的计算。 因此,缓存和重用早期资源的能力对于优化性能至关重要。
非常简单的缓存提供了将信息临时存储在缓存层中的选项。
缓存有哪些类型?
缓存有不同的类型,通过结合使用它们,您将获得更高的性能。
浏览器缓存
打开网页的内容之前,浏览器需要使用JavaScript文件,样式表,字体等一堆东西,除了页面内容外,还需要下载所有其他东西。
如果浏览器缓存了这些文件,则每次加载网站时都无需下载它们。 第一次加载站点通常需要几秒钟,但是在浏览器缓存这些文件之后,加载时间将大大减少。
服务器缓存
服务器缓存是指为特定页面保存HTML文件,并在以后的每个请求中使用。 这就是所谓的全页缓存。
服务器缓存还有另一种类型-对象缓存,与全页缓存不同,对象缓存仅缓存某些信息(片段)。
页面缓存
被认为是最有效的缓存。 它的名称对它的工作方式不言而喻。 当用户“ A”访问页面时,网站将对其进行构建并将其内容返回给用户的浏览器。 在页面高速缓存运行的情况下,将保存此页面内容,以便当用户“ B”访问同一页面时,页面高速缓存将复制先前发送的内容。
页面缓存的最大优点是,缓存的页面几乎在访问时返回。 结果,即使在内存速度最快,CPU使用率最低的最弱服务器上,也要处理数百万个请求并重现页面。
但是,这种类型的缓存也有其缺点:例如,无法为授权用户或页面内容取决于当前用户变量的用户缓存页面。
数据库缓存
数据库缓存是计算机应用程序设计中包含的过程,该应用程序通过访问后端数据库按需(动态)生成网页。 数据库缓存通常通过以频繁访问的读取数据的形式消除不必要的压力,从而增强了主数据库的功能。 缓存本身可以在多个区域中运行,包括数据库,应用程序或作为独立层。
当将这些应用程序部署在涉及基于浏览器的客户端,Web应用程序服务器和后端数据库的多层环境中时,将使用中间层数据库缓存来实现高可伸缩性和性能。
对象缓存
WordPress中的对象缓存(对象缓存)涉及存储数据库查询。 它是一种内置的系统机制,可让您保存任何类型的数据(对象)并在必要时进行检索。 该缓存用于存储复杂操作的结果。
在您的WordPress网站上启用后,它可以帮助加快PHP执行时间,更快地向网站访问者提供内容并减少数据库的负载。
CDN(内容交付网络)
它是一个地理分布的网络基础结构,可向Web服务和站点的用户提供快速的内容交付。 CDN中包含的服务器在地理位置上以使站点/服务用户的响应时间最小的方式定位。
WordPress中的什么是Transients API?
Transients API是一种在网站数据库中存储信息块(代码字符串,HTML内容,WP_Query对象,JSON)的方法,而不是浏览器缓存。 Transients API与Options API非常相似,但主要区别在于Transients API具有有效期或更短的使用寿命。
瞬态的三个主要操作是设置值,获取值和删除值:
1.设置瞬态–
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.5中引入的几个时间常数中的一个(DAY_IN_SECONDS)来轻松表示时间。 这是所有时间常数的完整列表:
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
2.获得瞬态–
get_transient($ key);
要获得保存的瞬变,我们可以使用
get_transient($ transient_name);
在我们的情况下,我们可以通过以下方式获取列出查询结果的帖子:
get_transient( 'unique_listing_posts_query_results_name' );
在后面的示例部分中,我们将对此进行详细介绍。
3.删除瞬态–
delete_transient($ key);
正如我们在前面的小节中所述,我们可以使用Transients API来获取和存储对数据库的远程或本地(内容或来自数据库的查询)响应。
但是,这里出现了一个问题,即我们如何删除旧的存储内容(瞬态)。 有两种清除(删除)瞬态的方法:
自动删除
关于瞬态的最酷的事情是,如果我们设置了失效时间(寿命) ,它们会自动失效。 如果您试图在瞬态过期后从数据库中检索瞬态,WordPress将自动将其删除,以防止混乱。 一旦有人打开网站,瞬态将被重新创建。 通过这种方式,我们可以确保从远程或本地API获得新鲜的内容。
手动删除
有时,我们需要通过手动删除瞬变来迫使其过早死亡。 当给定的活动(添加新菜单项,保存或更新帖子,添加或更新类别等)会使缓存的数据固有地过时并且需要更新时,此功能很有用:
我们必须使用的功能是
delete_transient($ transient_name)
在我们的情况下应该是:
delete_transient( 'unique_listing_posts_query_results_name' );
注意:重要的是不要使用瞬变来存储无法重新创建的有价值的数据!
为什么我们应该使用瞬态API?
只要我们的计算密集型值不经常更改且您想缓存,就可以使用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,请求一个对象(更确切地说是页面)your-website.url,并返回该页面的点赞次数:
函数get_facebook_likes(){ $ result = wp_remote_get('https://graph.facebook.com/your-website.url'); $ result = json_decode(wp_remote_retrieve_body($ result)); 返回$ result-> likes; } 回声“ Facebook喜欢:”。 get_facebook_likes();
该功能的执行时间取决于许多因素,包括服务器相对于Facebook服务器的位置,状态和网络速度等。平均而言,一个功能可能需要1-3秒。
这意味着在站点上使用此功能时,每页的加载时间将增加1-3秒。 而且,如果我们在500秒内调用此函数500次以上,Facebook将开始生成错误而不是结果。
为了加快此功能,我们可以使用WordPress Transients API并将结果保存1小时:
函数get_facebook_likes(){ if(false ===($ likes = get_transient('fb_likes'))){ $ result = wp_remote_get('https://graph.facebook.com/your-website.url'); $ result = json_decode(wp_remote_retrieve_body($ result)); $ likes = $ result-> likes; //将瞬态设置为一个小时(以秒为单位) set_transient('fb_likes',$ likes,1 * HOUR_IN_SECONDS); } 返回$ likes; }
因此,当第一次调用此函数时,WordPress在收到Facebook请求后,会将结果写入数据库,以后将在一个小时内从数据库返回此结果,而无需向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表中进行搜索,以获取所有预期结果。
这是我们如何完成此操作的完整示例:
函数show_posts_from_category(){ $ args =数组( 'cat'=> 555,//随机类别ID 'posts_per_page'=> 8,//要显示的相关帖子的随机数 'No_found_rows'=>是, ); $ hash = md5($ args ['cat']); //类别ID的MD5哈希 $ transient_key ='类别-'。 $ hash; //瞬态键 if(false ===($ posts_from_category_html = get_transient($ transient_key)))://瞬态已过期/尚未设置 $ the_query =新的WP_Query($ args); //获取查询 ob_start(); //打开输出缓冲 while($ the_query-> have_posts()):$ the_query-> the_post(); ?> <div class =“ item”> <div class =“ bigthumb”> <a href="<?php the_permalink();?>“ rel =” bookmark“ title =” <?php the_title();?>“> <?php if(has_post_thumbnail())the_post_thumbnail('big-thumb' ); ?> </a> </ div> <h3> <a href="<?php the_permalink();?>“ rel =” bookmark“ title =” <?php the_title();?>“> <?php the_title(); ?> </a> </ h3> <?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网站的加载时间并提供出色的用户体验的好方法。 在插件和主题中使用瞬态很简单,仅增加了几行代码。 如果在适当的情况下(例如长数据库查询或复杂的处理数据)使用它,可以节省站点上的加载时间几秒钟。