在卸载插件时清除缓存

时间:2016-07-04 作者:J.D.

卸载插件时,应删除站点(或网络,如果在多站点上)中的所有相关数据。例如,如果插件向数据库中添加表,它应该从数据库中删除这些表。

我的问题涉及这样一种情况,即插件实际上_doing_it_right() 并使用wp_cache_*() 功能。

我认为卸载插件时,应该清除这些缓存。我的理由是,有时用户可能会在卸载后重新安装插件(例如,如果他们只是测试插件,想要删除测试数据并重新开始)。如果卸载时未清除缓存,插件可能会在重新安装后从缓存中检索该重影数据,从而导致非常奇怪的行为。

当然,这主要是那些具有某种持久缓存的站点所关心的问题。(而且对于那些存储量相当大的用户来说,情况会更糟,因为过时的数据可能会保留更长的时间。)

但是,对于任何启用了持久缓存后端的站点,拥有一堆来自已卸载插件的陈旧数据并不理想。

尝试清除这些缓存的缺点是无法清除整个缓存组。插件必须循环遍历数据库表中对象的所有ID,并清除每个ID的缓存。因此,在清除缓存和保留缓存之间存在资源使用的权衡。

我的问题是,有没有其他人考虑过是否应该在卸载时清除插件缓存,以及什么时候值得权衡?这是已知的最佳实践吗?

2 个回复
最合适的回答,由SO网友:Rarst 整理而成

根据具体要求,有不同的方法来实现这一点。

例如,在您的情况下,您似乎更担心插件拾取的是重影数据,而不是留下的数据。通过生成要使用的唯一密钥前缀并在卸载时刷新该前缀,这种情况可能更容易处理。无前缀=无数据访问。

我想说,一般情况下,忽略这个问题,并对瞬态使用适当的超时值。如果数据只与特定的时间量相关,那么使用适当的超时可以隐式地处理它。

选项可以(应该)存储为单个集合,因此清除这些选项既简单又快速。

SO网友:Mark Kaplun

是的,应该是这样,特别是因为缓存可能包含用户可能希望使用插件删除的敏感信息。

最好的方法是以一种易于删除所有持久信息的方式来设计系统,例如,将所有缓存文件放在一个目录下。

就您的示例而言,缓存在理论上不应该是对象的一部分(它不是对对象的任何描述),因此您的问题在于对象的设计,这导致您在清除缓存方面存在问题。如果您唯一的选择是DB中的缓存(在我看来,这就像早期优化的症状),那么请为其使用不同的表。

Update

你的假设是wp_cache_* API使用持久存储为false。实际上,这是核心代码的一个重要假设,即它们不是持久的,驱动缓存的任何东西都会不时进行“垃圾收集”(核心很少从缓存中删除任何内容)。不进行垃圾收集的缓存系统要么非常特定,要么有缺陷,就好像如果不这样做,就会在某个时候耗尽RAM/磁盘空间。

此外,缓存实现可能不支持删除(不太可能,但奇怪的事情时有发生),因此在任何情况下都无法清除数据。

本质上。一方面,这些是第三方工具,您可能没有足够的控制权来确保删除任何内容,另一方面,在实践中,它们中的大多数都足够聪明,可以在足够合理的时间(不到一天)内自动删除您的数据,这使得清理数据成为一个“好东西”,但完全不是必需的。

是的,人们确实使用redis进行缓存,但在我看来这是一个错误。redis是一个nosql DB,而不是RAM/分布式缓存,尽管它可能可以配置为像这样使用。

相关推荐

menu customization

我正在我的页面上使用高级主题。该主题在整个站点中只接受一个菜单。该网站是一个单页网站。主题的工作方式是,我们必须建立一个主页,然后使用菜单项来制作网站的各个部分。因此,我创建了一个菜单,其中包含我想要的所有部分,使用我创建的页面已经设置为部分。例如:我有主页、照片、视频等。这些都是单独的页面,但当我将它们作为菜单的一部分时,它们将在一个页面中显示在另一个页面的下方,菜单项将滚动到该页面上的锚定位置。许多主题都是这样工作的。My problem is :我需要翻译菜单或设置另一个页面(不是作为节,而是一个正