在做了几个月之后,我相信我最初的问题是有充分根据的,虽然这项技术肯定不是新技术,但我正在做的是极大地优化我的系统中的许多东西:
(这更具哲理,但我会提供代码)
我不打算讨论一个大家都能理解的事实,即您不应该临时处理会影响工作流程的项目/查询,也不应该临时处理所有内容,因为这会使数据库超载,尤其是在有大量大型查询的情况下——例如,在一个不太好的主机上,将每个用户的帖子(假设你有一个大社区)成群结队地转移是一个很大的禁忌。你可能有一些非活动用户,每个用户都有10-15篇帖子,但没有人去他们的页面,所以他们的数据在数据库中只会保持空闲,just waiting for someone to access it to reset. (这可以通过在该用户的页面上创建瞬态来解决,希望您已经在这样做了!)
不管that\'s exactly how we must do it: Instead of thinking of transients in terms of expire-on-time, we should approach them from a expire-on-trigger way.
因此,不是:
set_transient( \'name\', \'value\', 3600 );
我们应该简单地在没有时间的情况下设置瞬态,并让“更干净的对象”处理它。输入建筑选项。我们必须查看该瞬态究竟保存了什么/以什么方式保存,并决定何时最好删除它。所以,让我们假设我们正在处理一个用户的帖子,并且我们不会在计时器上重新更新他的瞬态。我们能做的就是
save_post
只要在用户每次发布帖子时重新创建该瞬态即可。这样,只有当用户自己创建新帖子时,我们的瞬态才会自我更新:
add_action( \'save_post\', function( $post_id, $post, $update ) {
$author = get_post_field( \'post_author\', $post_id );
/**
* But if he is, then we\'ll delete his posts\' transient.
*/
delete_transient( \'user_posts_\' . $author->ID );
});
我们在这里所取得的成就是永远不会删除瞬态,除非它需要删除。
现在,当有人点击该用户的页面而不在计时器上时,将重新创建该瞬态。
唯一的问题是数据库现在变得越来越大,因此我们需要一种垃圾收集机制,它不会保留数据库中不“流行”的瞬态,因此我们不会将其弄乱。
我已经成功地将其应用于与媒体库图像相关的瞬态,在那里我需要一个瞬态,但我也希望有一个触发器来更新它。
完成这一点后,我越是关注这一点,我就越认为这应该被称为“知道何时需要更新瞬态”。
到目前为止,它为我解决了比它造成的问题更多的问题,但我同意,这是否能很好地扩展还不确定。同时,需要扩展的问题是一个需要解决的重大问题,如果您以这种方式对系统进行编码,只需断开这些删除机制,它就可以以传统方式工作。
So, exactly what has this helped me achieve? What are the benefits?
没有真正感觉到自己是瞬变的瞬变。现在,无论何时执行操作,都会看到其结果,与正常方式一样,您需要等待一段时间才能看到效果(在瞬态过期之后)。只需刷新即可获得新数据,无需等待,无需失去优势。
事实上,删除某个触发器上的瞬态比删除计时器上的瞬态更有意义。