【问题标题】:Wordpress wp_schedule_event randomly between 30 and 60 minutesWordpress wp_schedule_event 随机在 30 到 60 分钟之间
【发布时间】:2016-12-17 13:36:34
【问题描述】:

是否可以在 30 到 60 分钟之间随机启动 WP-Cron?

我有什么

add_action('my_hourly_event', 'do_this_hourly');
function my_activation() 
{
    if(!wp_next_scheduled( 'my_hourly_event' ))
    {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'my_hourly_event');
    }
}
add_action('wp', 'my_activation');
function do_this_hourly() 
{
   // do something
}

【问题讨论】:

  • 您应该可以使用wp_schedule_single_event() 设置30-60 分钟的随机间隔。每次运行时只需在事件挂钩中重新创建相同的单个事件。
  • 您是否希望 cron 在 30 到 60 分钟之间的任何时间随机运行,以便有时在 30 分钟后运行,有时在 48 分钟后运行,有时在 37 分钟后运行,有时在 60 分钟后运行?还是您希望它在 30 分钟或 60 分钟后随机运行(没有其他间隔,如 45 分钟、53 分钟等?

标签: php wordpress cron


【解决方案1】:

在下面的代码中,我将使用激活钩子而不是 wp 钩子,如果它是您的代码所在的主题,请随意使用 after_switch_theme...

您可以使用wp_schedule_single_event() 并简单地添加一个事件,以在每次事件发生时在 30-60 分钟之间随机发生;)

/**
 * Registers single event to occur randomly in 30 to 60 minutes
 * @action activation_hook
 * @action my_awesome_event
 */
function register_event() {
    $secs30to60min = rand( 1800, 3600 ); // Getting random number of seconds between 30 minutes and an hour
    wp_schedule_single_event( time() + $secs30to60min, 'my_awesome_event' );
}

// Register activation hook to add the event
register_activation_hook( __FILE__, 'register_event' );
// In our awesome event we add a event to occcur randomly in 30-60 minutes again ;)
add_action( 'my_awesome_event', 'register_event' );

/**
 * Does the stuff that needs to be done
 * @action my_awesome_event
 */
function do_this_in_awesome_event() {
    // do something
}
// Doing stuff in awesome event
add_action( 'my_awesome_event', 'do_this_in_awesome_event' );

【讨论】:

    【解决方案2】:

    不幸的是 wp_schedule_event 没有 30 分钟,并且只接受以下时间间隔:每小时、每天两次 (12H)、每天 (24H)。

    在我看来,有一个可以随机更改的预定事件有点奇怪,也许你应该看看不同的实现。 在不讨论您的选择的情况下,我将提供一个可能的答案。

    Wordpress cron 系统中有一些带有挂钩的插件,以允许不同的时间间隔。

    一种解决方案是每 30 分钟只设置一个 cron,并有一个随机执行或不执行的自定义函数。

    if (rand(0,1)) { ....
    

    例如:

    1. 30 分钟后,函数将被执行(你有 30 分钟的 cron)
    2. 再过 30 分钟后,函数会跳过运行
    3. 接下来的 30 分钟将再次触发并执行(你有 1 小时的 cron)。

    问题是在 1 小时(跳过 1 次后)强制执行,因为您最终可能会跳过超过 +30 分钟。这可以通过存储上次执行的值来实现。

    另一种解决方案是几乎同时拥有 2 个 cron(30 分钟和 1 小时),并具有一个自定义函数,如果 1 小时未运行,则将触发 30 分钟,依此类推。

    这是一个不错的Wordpress cronjob plugin 如果您需要将 cron 执行安全地存储在 Wordpress 表中,您可以使用 Wordpress add_option function,以及 get_option 和 update_option 来获取和更新其值。

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2020-02-23
      • 2012-04-06
      • 1970-01-01
      • 2011-10-28
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多