如何每5分钟运行一次函数?

时间:2015-11-10 作者:Foolish Coder

我有一个每5分钟运行一次的函数。我从法典中引用了以下内容:

<?php wp_schedule_event(time(), \'hourly\', \'my_schedule_hook\', $args); ?> 
我想每5分钟运行一次此功能,无论何时启动。我怎么能这样?

它还表示,codex表示,当访问者访问该网站时,将运行cron。有没有办法只按分钟运行cron而不等待访问?

假设以下函数应每5分钟运行一次,那么如何使用wp_schedule_event()wp_cron?

function run_evry_five_minutes(){
    // codes go here
}

7 个回复
SO网友:Johano Fierra

您可以通过cron\\u计划创建新的计划时间:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            \'interval\' => 5*60,
            \'display\' => __(\'Once every 5 minutes\'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            \'interval\' => 30*60,
            \'display\' => __(\'Once every 30 minutes\'));
    }
    return $schedules;
}
add_filter(\'cron_schedules\',\'my_cron_schedules\');
现在,您可以安排您的功能:

wp_schedule_event(time(), \'5min\', \'my_schedule_hook\', $args);
要仅计划一次,请将其包装在函数中,并在运行之前进行检查:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), \'5min\', \'my_schedule_hook\', $args);
}
if(!wp_next_scheduled(\'my_schedule_hook\',$args)){
    add_action(\'init\', \'schedule_my_cron\');
}
请注意$args参数!如果不在wp\\U next\\u scheduled中指定$args参数,但在wp\\U schedule\\u事件中使用$args,将导致几乎无限多个相同的事件被调度(而不是一个)。

最后,创建要运行的实际函数:

function my_schedule_hook(){
    // codes go here
}
我认为重要的是,每次加载页面时,wp cron都会检查计划并运行到期的计划作业。

因此,如果您的网站流量较低,每小时只有1名访问者,那么wp cron将仅在该访问者浏览您的网站时运行(每小时一次)。如果您的网站流量很大,访问者每秒都会请求一个页面,则会每秒触发wp cron,从而在服务器上造成额外负载。

解决方案是停用wp cron,并在最快重复计划wp cron作业的时间间隔内(在您的情况下为5分钟)通过实际cron作业触发它。

Lucas Rolff 详细说明问题并给出解决方案。

作为替代方案,您可以使用免费的第三方服务,如UptimeRobot 如果您不想停用wp cron并通过真正的cron作业触发它,请每5分钟查询一次您的站点(并触发wp cron)。

SO网友:bonger

如果你的网站流量很大,那么你可以尝试使用set_transient() 每5分钟(大约)运行一次,例如:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( \'every_5_minutes\' ) ) {
    set_transient( \'every_5_minutes\', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It\'s better use a hook to call a function in the plugin/theme
    //add_action( \'init\', \'run_every_five_minutes\' );
}

SO网友:Régis Ramillien

您可以在插件激活中触发它,而不是在每次插件调用中:

//Add a utility function to handle logs more nicely.
if ( ! function_exists(\'write_log\')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( \'ABSPATH\' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            \'interval\' => 10,
            \'display\'  => __( \'Once every 10 seconds\' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( \'cron_schedules\', \'woocsp_schedules\' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( \'woocsp_cron_delivery\', \'scheduleTriggered\' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, \'woocsp_activation\');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( \'woocsp_cron_delivery\' ) ) {
        wp_schedule_event( time(), \'10s\', \'woocsp_cron_delivery\' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, \'woocsp_deactivation\');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook(\'woocsp_cron_delivery\');

    write_log("Plugin deactivated.");
}

SO网友:Andrew Welch

恐怕除了等待有人访问您运行某个功能的站点之外,唯一的其他选择是在您的服务器上使用类似的方式设置cron作业https://stackoverflow.com/questions/878600/how-to-create-cronjob-using-bash 或者,如果您的服务器上有一个cpanel风格的界面,有时会有一个gui来进行设置。

SO网友:Marco

这个Cronjob Scheduler 插件允许您可靠、及时地运行频繁的任务,而无需任何人访问您的站点,您所需要的只是至少一个操作和一个Unix Crontab计划。

它很容易使用,而且非常灵活。您可以创建自己的函数,并在其中定义一个操作。然后,您可以从插件菜单中选择您的操作,并随时启动它。

SO网友:Bruno Cantuaria

我有一个可能的解决方案,使用调度函数和递归WP-Ajax函数。

创建一个60分钟的调度事件来运行函数此函数将通过使用Ajax触发递归函数file_get_contents()

  • 此ajax函数将检查您的计数器,如果计数器等于或高于60,它将重置计数器并等待下一个cron作业。

    如果计数器是5的倍数(因此每5分钟一次),它将执行您想要的功能

    除此之外,它还会休眠59秒sleep(59); (假设你的功能很快)。睡眠后,它会使用file_get_contents()再一次

    需要注意的重要事项:

    创建一种中断进程的方法(即检查数据库上的值)

  • 创建一种防止同时执行两个进程的方法
  • 在file\\u get\\u内容上将标头的时间限制设置为2秒或3秒,否则服务器可能会有多个进程等待不执行任何操作
  • 您可能需要使用set_time_limit(90); 为了防止服务器在睡眠前中断您的功能,这是一个解决方案,但不是一个好的解决方案,它可能会被服务器阻止。使用外部cron,您可以设置一个简单的函数,服务器将每5分钟使用一次该函数上的资源。使用此解决方案,服务器将一直使用其上的资源。

  • SO网友:Mike

    @johano的回答正确地解释了如何为WP cron作业设置自定义间隔。第二个问题没有回答,那就是如何每分钟运行一个cron:

    文件中的wp-config.php, 添加以下代码:

    define(\'DISABLE_WP_CRON\', true);
    
    添加cron作业(crontab -e 在unix/linux上):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron
    
    第一部分(步骤1)将禁用WordPress内部cron作业。第二部分(步骤2)将每分钟手动运行WordPress cron作业。

    有了@Johano的答案(如何每5分钟运行一次任务)和我的答案(如何手动运行cron),您应该能够实现您的目标。

    相关推荐

    Wp-cron和执行is_admin()包含的脚本中的代码

    我正在开发一个插件。其后端设置允许管理员从第三方数据提供商更新站点数据文件,或打开/关闭wp cron作业以自动完成此操作。在此(简化)代码中I assume my wp-cron job will only be run if someone logs in to the WP Dashboard? (不是我真正想要的)if (is_admin()) { include \'my_update_script.php\'; include \'settings_form_stuff