并非所有WP代码都是公共代码
如果您要公开发布某些内容,那么科夫舍宁说的所有话都是完全正确的。
如果您要为自己或您的公司编写私人代码,情况会有所不同。
无论如何,外部对象缓存都是一个很大的好处
如果可以的话,强烈建议您设置外部持久对象缓存。
kovshenin的答案中关于瞬态和MySQL的所有内容都是非常正确的,考虑到WP本身和一堆插件都使用了对象缓存...那么您获得的性能提升,绝对值得(少量)设置像Redis或Memcached这样的现代缓存系统。
缓存的值可能不存在:很好
此外,是的,外部对象缓存不可靠。您永远不应依赖瞬态存在的事实。您需要确保如果缓存不在应有的位置,则它可以正常工作。
缓存不是存储,缓存是缓存。
选择性使用缓存
请参阅以下示例:
function my_get_some_value($key) {
// by default no cache when debug and if no external object_cache
$defUse = ! (defined('WP_DEBUG') && WP_DEBUG) && wp_using_ext_object_cache();
// make the usage of cache filterable
$useCache = apply_filters('my_use_cache', $defUse);
// return cached value if any
if ($useCache && ($cached = get_transient($key))) {
return $cached;
}
// no cached value, make sure your code works with no cache
$value = my_get_some_value_in_some_expensive_way();
// set cache, if allowed
$useCache and set_transient($key, $value, HOUR_IN_SECONDS);
return $value;
}
使用这样的代码,在您的私有站点中,站点性能可以提高很多,尤其是在用户数量很多的情况下。
注意:
- 默认情况下,当调试打开时不使用缓存,因此希望在您的开发环境中使用。相信我,缓存可以使调试陷入困境
- 默认情况下,当WP未设置为使用外部对象缓存时,也不使用缓存。这意味着与MySQL相关的所有问题都不存在,因为当他们使用MySQL时,您不会使用任何瞬态。一个可能更简单的选择是使用
wp_cache_*
functions,因此,如果未设置外部缓存,则该缓存发生在内存中,并且永远不会涉及数据库。
- 缓存的用法是可过滤的,以处理您可能遇到的一些极端情况
如果没有缓存则没有Webscale
您不应该尝试解决高速缓存的速度问题。如果遇到速度问题,则应重新考虑代码。
但是要以webscale扩展网站,非常需要缓存。
在很多时候(但并非总是)碎片化的情况下,上下文感知缓存比主动式全页缓存更具灵活性和适用性。
你的问题:
我应该在这里全部使用Transient API吗?
这要看情况。
您的代码是否消耗大量资源?如果没有,也许不需要缓存。如前所述,不仅仅是速度问题。如果您的代码运行速度很快,但需要几个用户使用大量CPU和内存...当您有100个或1000个并发用户时会发生什么?
如果您意识到缓存将是一个好主意。
...是公共代码:可能不是。您可以考虑选择性地缓存,就像上面的示例中的公共代码一样,但是如果您将这样的决定留给实现者,通常会更好。
...是私人密码:很可能是。但是即使对于私有代码,选择性地缓存仍然是一件好事,例如用于调试。
记住,无论如何,这些wp_cache_*
函数可以使您访问缓存,而不会污染数据库。
是否应该使用Transient API缓存$ related_posts数组或$ html_output字符串?
这取决于很多事情。弦多大?您正在使用哪个外部缓存?如果您要缓存帖子,将ID存储为数组可能是个好主意,通过它们的ID查询相当数量的帖子非常快。
最后说明
瞬态API可能是WordPress最好的东西之一。多亏了可以在任何类型的缓存系统中找到的插件,它成为许多可以在后台运行的软件的愚蠢的简单API。
在WordPress之外,很难找到这样的抽象,它可以与一堆不同的缓存系统一起使用,并且可以毫不费力地从一个系统切换到另一个系统。
您很少听到我说WordPress比其他现代功能要好,但是当我不使用WordPress时,瞬态API就是我错过的少数几个功能之一。
当然,缓存很困难,不能解决代码问题,不是灵丹妙药,但是您需要构建一个高流量站点才能正常工作。
WordPress的想法是使用未充分优化的MySQL表进行缓存,这是非常疯狂的,但是最好不要因为WordPress默认情况下这样做而使自己远离缓存。
您只需要了解事物的工作原理,然后做出选择即可。