使用SET_TRANSPENT每分钟同步数据

时间:2018-02-23 作者:Carsten Schmitt

我将插件的一些数据与外部API同步。此同步进程应每分钟启动一次。因此,我使用以下代码来实现这一点:

if ( ! get_transient( \'my_task_sync_method\' ) ) {
    set_transient( \'my_task_sync_method\', true, 1 * MINUTE_IN_SECONDS );
    my_task_sync_method();
}
目前,我在插件初始代码中运行此代码。我知道这是一种变通方法,不是transient的正常用例,但这是迄今为止我找到的最好的解决方案。

这很好,但有时当我重新加载后端页面(例如仪表板)时,我会得到我生成的自定义post admin页面的一些部分。这似乎是在同步进程运行时重新加载页面时发生的。这件事很难调整。但也许有人知道这种问题,能帮助我?如果有更好的同步解决方案,如果你告诉我更好的方法,我会很高兴。

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

据我所知,*_transient() 基本上是*_option() 包装在缓存计时器中。

在这种情况下,这意味着set_transient( \'...\', true, * MINUTE_IN_SECONDS );not 每分钟运行/重新评估一次。相反,当访问者/用户加载了页面,并且其中的数据超过60秒时,它将运行/重新评估。这并不理想,因为它所做的是将同步方法的处理放在用户加载时间上,这不好,而且可能会搞砸,就像你经历的打嗝一样-它与此相关:

当我在同步进程运行时重新加载页面时,似乎会发生这种情况

因此,您在没有其他访问站点的时间超过60秒后访问管理员。这个_transient 因此过期,并启动my_task_sync_method() 在你的页面加载中,它一定以某种方式响应或中断了你的加载过程。

要解决此问题,首先,您应该使用Wordpress Cron, 不_transient. Cron作业在后台运行,并坚持60秒同步,不依赖用户访问。

下面是cron任务的基本片段:

// add a 60 second cron schedule
add_filter(\'cron_schedules\', function ( $schedules ) {
    $schedules[\'everyminute\'] = array(
        \'interval\' => 60,
        \'display\' => __(\'Every Minute\')
    );
    return $schedules;
});

// register your cronjob
add_action(\'wp\', function () {
    if ( !wp_next_scheduled( \'my_task_sync_cronjob\' ) )
        wp_schedule_event(time(), \'everyminute\', \'my_task_sync_cronjob\');
});

// the registered cron hook, that\'ll fire your function
add_action(\'my_task_sync_cronjob\', \'my_task_sync_method\');
其次,你应该确保my_task_sync_method() 没有回显任何数据。我想这是你的症状。

请注意,我以匿名方式将函数放置在挂钩中,这样做是为了更容易在此处显示。您可能想让它们回调,以防其他开发人员想要利用您的挂钩

SO网友:Mark Kaplun

您的同步功能可能做得太多了,尤其是当您需要联系外部资源时。

正确的方法是在信息more than a minute stale 而不是每分钟。这样,如果同步失败,您肯定不会陷入困境。

我个人讨厌短暂的生活by design 不可靠。您应该使用一个选项,在该选项中存储下次应该进行更新的时间,并检查该时间是否已过,该选项中可能会存储一个额外的“标志”,指示何时正在进行更新,以防止重复更新。

补充说明:虽然1分钟的间隔在大多数情况下应该是可以的,但我的直觉是它太短了。Web服务器和Web软件的设计并不是为了非常准确地确定它们的时间,而站点无法获得超过一分钟的陈旧信息的情况听起来很荒谬。假设您在每次同步时都要进行一些额外的DB写入,那么您正在为一些实际上可能不需要的东西而耗费服务器的能力。

结束

相关推荐

Add async script

我正在开发一个插件,该插件必须在页面上插入脚本(类似于RefTagger), 这很容易使用wp_enqueue_script, 但有两个原因我不能这样做:脚本标记必须有一个ID,并且应该异步执行。我找到了三种可能的解决方案,但我真的不喜欢其中任何一种:Just echo the script in wp_footer这是最简单的一个,我可以完全控制脚本标签,但它可能会遭到反对(我打算将我的插件提交到插件库,所以欢迎提供有关官方指南的任何建议)Use the standard functions and u