WordPress 中的瞬变指南
已发表: 2023-02-12作为 WordPress 开发人员,您可能已经知道性能对于一个成功的网站有多么重要。 然而,了解 WordPress 中的瞬变以及它们如何帮助您优化项目可能有点棘手。
幸运的是,当您将它们分解时,瞬变并没有那么难理解。 只要牢记一些关键准则,您就可以顺利地将它们整合到下一个 WordPress 插件中。
在这篇文章中,我们将概述什么是 WordPress 瞬变,以及如何以及何时使用它们。 有很多基础要覆盖,所以让我们开始吧!
什么是 WordPress 瞬变?
为了理解瞬态,了解一些缓存和应用程序编程接口 (API) 的基本知识会很有帮助。
缓存网页数据本质上是一种临时保存网站数据的方式,这样如果对同一数据有多个请求,网站就不必重新运行 MySQL 或 PHP。 这可以节省数秒的时间并减少服务器负载。
这个想法是暂时保留数据,因此有了“瞬态”这个词。 Transients API 类似于 WordPress Options API。 您为数据指定一个名称和一个值(可以很复杂,如多级 PHP 数组),它存储数据。 稍后,甚至可能根据不同的请求,您可以使用数据的名称来检索该数据。 不同之处在于选项表中的数据将永远存在。 也就是你可以存数据,三年后,它还在。
每个瞬态都由三部分组成:
- $瞬态。 这是用于识别瞬变并调用它的字符串。 它也被称为瞬态的“键”或“名称”。
- $值。 这是通过 API 检索的信息。 transient 的值可以是对象、数组、数字或字符串。
- $过期。 这是瞬态在您的数据库中保留的时间,在它被删除并且您必须再次通过 API 访问您需要的信息之前。
从表面上看,这就是 WordPress 瞬变的全部内容。 但是,为了正确使用它们,您需要了解更多信息。
然而,瞬态数据不会留下来。 这才是重点! 您可以请求数据,并通过以下两种方式之一发现它丢失了。 首先,当您存储数据时,您指定一个到期日期。 例如,您可以说“将其存放三个小时”。 因此,如果您在四个小时后请求它,它就会丢失。
第二种方式是允许数据在任何时间、任何原因简单地消失。 我知道这听起来很奇怪! 如果不能指望数据,存储数据有什么意义? 关键是存储是 WordPress 将尝试满足的请求,但由于这种灵活性,可以使用不同类型的临时存储实现,这意味着可以使用不同的高级技术使临时存储非常高效, 即使在多服务器集群环境中也能正常运行。
因为这个“随时消失”的东西,你通常使用瞬态缓存。 也就是说,如果你需要计算一些需要实时的东西,比如缓慢的 MySQL 查询,或者从外部源检索数据,比如某人的 Twitter 或 RSS 提要,你可以将计算的数据存储在瞬态中,知道如果它丢失总是可以重新创建它。 但在通常情况下——当它没有丢失时——你可以快速获得数据而无需重新计算。
在您的 WordPress 网站上使用瞬变的好处
正如我们之前提到的,瞬态的主要好处是它们可以提高网站性能。 这里以 Google Site Kit 插件为例,简要介绍了它的工作原理。
激活插件后,它会使用 API 在 WordPress 仪表板中显示来自 Analytics 和 Search Console 等平台的数据。 如果没有瞬变,每次您查看 Site Kit 仪表板时,WordPress 都必须从每个工具中检索此信息:
相反,Site Kit 包括缓存来自 Analytics 和 Search Console 的数据的瞬态。 它们存储一天(如果平台没有返回数据,则存储一小时)。
以后每次访问 Site Kit 仪表板时,WordPress 都可以从数据库中快速检索存储的信息,而不必再次调用 API。 当有效期结束时,旧数据将被删除。
这意味着您不必每次都等待结果加载。 这在各种情况下都很方便,例如显示您的帖子的社交媒体共享计数或显示新闻源。
在您的 WordPress 网站上使用瞬变的缺点
当您的插件/主题在不同的瞬态实现下运行时,让您遇到瞬态问题的是不同且难以重现的行为。 不同的瞬态实现意味着您只会在某些类型的站点的某些配置中遇到问题,而不会在其他站点中遇到问题。 作为开发人员,如果您没有意识到这个陷阱并且没有相应地编码,您会认为您的代码是正确的,但实际上它会在现场崩溃,您甚至不知道如何重现它!
何时使用 WordPress 瞬变
瞬变在到期后将从您的数据库中删除。 因此,您只想将它们用于不断重新创建的信息。
此外,虽然它们可以提高项目的性能,但瞬变最好保留给大型查询和远程调用。 如果它需要更多的代码来创建一个瞬态,而不是每次需要时简单地对资源发出新的请求,那么你最好不要这样做。
管理 WordPress 瞬变
如果您想轻松查看和管理当前在您的 WordPress 网站上工作的瞬变,您可以安装 Transients Manager 插件:
它提供了一个完整的瞬变列表,您可以通过导航到工具 > 瞬变找到它:
在这里您可以看到我们之前列出的所有三个临时元素——键(名称)、值和有效期。 您可以通过单击“编辑”链接来编辑这些功能中的任何一个:
您还可以单独或批量删除瞬变。
瞬态中使用的基本操作
在编写自己的瞬态代码时,您可能需要使用三种基本操作。 我们在下面概述了它们中的每一个,并继续以 Site Kit 为例。
1.设置瞬态
创建或“设置”瞬态是定义键、值和有效期并将该信息应用于相关数据的过程。 为此,您将使用以下格式:
Set_transient ('key', $value, expiration_period)
以下是 Google Site Kit 中用于设置存储分析数据的瞬态的代码:
// Cache "data found" status for one day, "no data" status for one hour. set_transient( $transient_key, (int) $has_data, $has_data ? DAY_IN_SECONDS : HOUR_IN_SECONDS ); } return (bool) $has_data; } }
临时键是googlesitekit_analytics_has_data (在代码前面定义),值是$has_data或$has_data ? ,有效期为一天或一小时(取决于值)。
2. 检索瞬变
检索瞬变有点复杂。 首先,您需要使用一个函数来请求必要的数据。 然后您将检查它是否具有应加载的相应瞬态,而不是发出新的 API 请求。
结果可能看起来像这样:
function some_function(){ $transient = get_transient('key');
然后,您需要返回瞬态数据,或删除过期数据并重新调用源。 最后,您必须在返回新数据后设置瞬态,以便在有效期结束之前再次存储它。
在 Google Site Kit 中,它看起来像这样:
/** * Checks whether Analytics data exists for the given URL. * * @since 1.4.0 * * @param string $url The url to check data for. * @return bool */ protected function has_data_for_url( $url ) { if ( ! $url ) { return false; } $transient_key = 'googlesitekit_analytics_has_data_' . md5( $url ); $has_data = get_transient( $transient_key ); if ( false === $has_data ) { /* @var Google_Service_AnalyticsReporting_Report[]|WP_Error $reports Array of reporting report instances. */ $reports = $this->get_data( 'report', array( 'url' => $url, 'metrics' => array( array( 'expression' => 'ga:users' ), array( 'expression' => 'ga:sessions' ), ), ) ); if ( is_wp_error( $reports ) ) { $reports = array(); // Bypass data check and cache. } foreach ( $reports as $report ) { /* @var Google_Service_AnalyticsReporting_Report $report Report instance. */ $report_data = $report->getData(); /* @var Google_Service_AnalyticsReporting_ReportData $report_data Report data instance. */ foreach ( $report_data->getTotals() as $date_range_values ) { /* @var Google_Service_AnalyticsReporting_DateRangeValues $date_range_values Values instance. */ if ( isset( $date_range_values[0], $date_range_values[1] ) && ( 0 < $date_range_values[0] || 0 < $date_range_values[1] ) ) { $has_data = true; break 2; } } }
这段代码后面应该是我们在上一节中包含的用于设置瞬变的片段。
3.删除瞬变
在某些情况下,您可能会发现您想要删除瞬变。 例如,如果您希望始终在 Google Site Kit 中看到最新的分析,最好不要缓存数据(尽管我们不建议您实际删除 Site Kit 的瞬态数据)。
否则,即使您有新访客,该插件也会全天显示相同的结果。 由于瞬态持续 24 小时,您下午查看的数据将只是您早上加载的数据的缓存版本。
删除瞬变最简单的方法是使用瞬变管理器插件。 但是,如果您想改用代码,可以使用delete_transient()函数。 您只需要临时密钥:
delete_transient('key');
但是,您必须对要删除的每个瞬态重复此操作。
瞬时过期:它是如何工作的?
可以用几种不同的方式来表示瞬态到期期限。 最简单的两个选项是:
- 以秒为单位 ( set_transient('key', $value, 86400))
- 使用 WordPress 时间常量 ( set_transient('key', $value, DAY_IN_SECONDS))
或者,您也可以设置永不过期的瞬变。 这在您希望保持瞬态数据相同的情况下非常有用,直到您手动删除和重置缓存信息。
创建永不过期的瞬变非常简单。 只需将set_transient函数中的过期参数留空,或将其标识为零即可。
了解 WordPress 瞬态 API
WordPress Transients API 只是将信息缓存在站点数据库中的一种方式。 它支持我们在本文中讨论的所有相关操作,包括设置、获取和删除瞬变。
换句话说,Transients API 只是 WordPress 核心的一部分,可让您使用瞬态。
Transients API 后端的两种最常见的实现:
- 内置于 WordPress 中的一个,因此是迄今为止最常见的。 瞬态值像常规选项一样存储在 wp_options 表中。 对于瞬态,会存储一个附加选项来保存到期日期。 访问瞬态时,WordPress 首先提取到期日期。 如果它已过期,WordPress 会从表中删除这两个选项,从而“清理”数据,并假装数据从未存在过。 如果它没有过期,它会从选项表中获取内容。
- 内存缓存。 Memcached 是一种非常简单但高效且可靠的服务器端软件,旨在完全执行 Transients API 应该做的事情——基于密钥存储数据,该密钥在给定时间过期,并且可以在需要时随时消失到。
使用 memcached 而不是 WordPress Transients 有两个特殊的好处,这就是我们在 WP Engine 上自动为您预配置它的原因。 我们支持你
我。 Memcached 在存储和检索值方面比 WordPress Transients 快 10 到 100 倍,这特别有趣,因为 transients 的目的是缓存数据以提高站点的速度。
二. Memcached 设置了数据占用的最大空间量(例如 64MB RAM),这意味着如果站点一次存储过多数据,它会自动丢弃旧数据,因此永远不会用完空间。 但是内置的 WordPress Transients 将在选项表中存储任意数量的数据。
在您的开发中应用瞬变
假设您重复读写同一个 Transients 密钥,并假设它有 1k 数据。 在这种情况下,Memcached 和 WordPress Transients 都将按照您的预期进行操作,并且两者都将占用大约 1k 的空间(在选项表中或在 memcached 中)。
现在假设您正在读取和写入不同的 Transients 键,每个浏览器会话都不同。 简而言之,如果您将用户会话数据存储在 Transients 中怎么办? 这在表面上是有道理的。 会话数据不应该永远存在,您也不想为特殊的数据库表而烦恼。 除此之外,许多 WordPress 托管公司不允许 PHP 会话,因此这确实是次佳选择。 它甚至是快速和多服务器的。
这就是差异出现的地方。 对于 Memcached 和流量较低的站点,此方法似乎有效。 这些值会持续一段时间,然后在过期时被删除。 但是,如果服务器负载很重,服务器需要存储的会话数据量将超过 memcached 中的可用空间,因此您会比您想象的更快开始丢失会话数据。 如果您没有在这种精确的、高负载的环境中进行测试,您将永远不会知道这一点。 一般来说,这些环境最终会如此快速地填充 memcached,以至于实际上 memcached 被禁用,因为它永远无法保留足够长的数据以供使用。 您实际上根本没有 Transient API 缓存!
但是使用 WordPress Transients,你会得到不同但仍然非常不受欢迎的行为。 因为这些值被写入数据库,而不是固定大小的 RAM 块,所以它们都会保留下来。 这意味着即使站点负载很重,您仍然拥有会话数据。 惊人的!
或者你是这么想的。 因为 Transient API 中没有说明的是当您使用会话等唯一键时会发生什么。 内置方法会导致选项表无限期地填满! 因为:WordPress 的“旧数据清理”仅在您请求密钥时运行(如我们之前所述)。 如果你只是留下钥匙,它会永远留在选项表中。 没有单独的过程可以清理这些!
我们不仅意识到了这个问题,还想帮助可能正在运行不理解这个问题的代码的客户。 这就是托管 WordPress 中的“托管”所在! 每天晚上,我们都有一个自动化流程来查看您的选项表以查找过期的瞬变,并删除它们(包括数据和过期日期项)。 繁荣! 他们走了,你不必担心他们。
所以我们这样做真是太棒了,但是作为应该在任何托管环境中正常运行的通用插件或主题的开发人员,您不能在您的插件或主题可能部署的所有潜在环境中执行此操作,并且您希望确保为用户和客户提供尽可能最优化的代码。
然而,既然您已经知道瞬态是如何出错的,那么看看并了解如何使您的代码更高效可能是一个很棒的主意。 如果您已经读到这里,您很可能喜欢优化您的代码,而这篇博文可能会为您挑战并激励您重写一些东西以提高可扩展性!
使用您的 WordPress 网站做更多事情
作为 WordPress 开发人员,为您的最终用户提供远程数据访问权限,同时保持快速性能是关键。 WordPress 瞬变可以帮助您实现这一目标。
但是,从闪电般快速的 WordPress 托管和专业开发人员资源中获得一点额外帮助也没什么坏处。 无论您是编码新手还是经验丰富的专业人士,我们都随时准备提供帮助。 看看我们今天的计划!