如何每5分钟运行一次功能?


15

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

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

我想每5分钟运行一次此函数,而不管何时启动。我怎么能这样

它还说,法典说,当访客访问该站点时,将运行cron。有什么方法可以按分钟运行cron而不等待访问吗?

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

function run_evry_five_minutes(){
    // codes go here
}

如果您需要如此短的间隔和准确性,则最好研究一下Linux cron或3rd party cron服务,
birgire 2015年

网站的流量非常大。.因此,无需考虑时间间隔..确保每2或3分钟就会触发一次。.客户喜欢从functions.php
Foolish Coder

如果没有在服务器上运行带有计时器的东西,则不可能触发php文件。
安德鲁·韦尔奇

文件?我们正在谈论的是functions.php中的函数
Foolish Coder 2015年

您是否认为免费的监视服务可能会触发CRON?newrelic.com/server-monitoring
jgraup

Answers:


28

您可以通过cron_schedules创建新的时间表时间:

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_next_scheduled中未指定$ args参数,而在wp_schedule_event中具有$ args将导致几乎相同数量的同一事件被调度(而不是一个)。

最后,创建您要运行的实际功能:

function my_schedule_hook(){
    // codes go here
}

我认为必须要提到的是,wp-cron在每次加载页面时都会检查计划并运行适当的计划作业。

因此,如果您的网站访问量低,每小时只有1个访客,则wp-cron仅在该访客浏览您的网站时运行(一个小时)。如果您的网站访问量很高,访问者每秒请求一个页面,那么将每秒触发一次wp-cron,这会导致服务器上的额外负载。

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

卢卡斯·罗尔夫(Lucas Rolff)解释了问题,并提供了详细的解决方案。

或者,如果您不想停用wp-cron并通过真正的cron作业触发它,则可以每5分钟使用免费的第三方服务(如UptimeRobot)来查询您的网站(并触发wp-cron)。


2

如果您的站点确实流量很大,那么您可以尝试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' );
}

好吧,嗯,是吗?!...
bonger 2015年

是的,它无法正常工作。在functions.php访问页面时,我使用了以下代码,将对数据库中的表进行更新function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }。但是数据库表甚至在6分钟后也不会更新。
愚蠢的编码员,2015年

不知道为什么它对您不起作用,但是实际上考虑使用get_transient()/ set_transient()不使用cron东西会更有意义,更简单,会更新答案...
bonger 2015年

@bonger是wp_schedule_event()的好选择吗?
Marko Kunic '16

@MarkoKunić不知道说实话,没有尝试过...它仅是一种解决方法,但是如果您尝试一下,请告诉我们...!(Johano Fierra的答案看起来不错wordpress.stackexchange.com/a/216121/57034
bonger

2

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

//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.");
}

1

恐怕除了等待某人访问运行功能的站点外,唯一的选择是使用诸如此类的/programming/878600/how在服务器上设置cron作业。-要创建cronjob-using-bash,或者如果您的服务器上具有cpanel样式的界面,有时会有一个GUI来进行设置。


是的..,我知道..我已经从cPnael创建了一些cron ..但是现在我试图从中运行函数,functions.php因为当函数位于plugin或中时,functions.php我们不能要求客户从cpanel设置cron对自己的..
愚蠢的编码器

1

的cronjob调度程序插件可以让你不必访问您的网站的人可靠和及时的运行常见任务,你需要的是至少1动作和Unix的crontab的时间表。

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


0

我有一个可能的解决方案,使用计划功能和递归WP Ajax函数。

  1. 创建一个60分钟的计划事件以运行功能
  2. 该函数将通过以下方式使用Ajax触发递归函数 file_get_contents()
  3. ajax函数在数据库上将有一个总数为60的计数器(小时内的每一分钟)。
  4. 这个ajax函数将检查您的计数器是否:

如果计数器等于或大于60,它将重置计数器并等待下一个cron作业。

如果计数为5的倍数(因此每5分钟计数一次),它将执行您所需的功能

并且,除条件外,它还会休眠59秒钟sleep(59);(假设您的功能是快速的)。睡眠后,它将file_get_contents()再次触发自身使用。

重要注意事项:

  1. 创建一种中断过程的方法(即检查数据库上的值)
  2. 创建一种方法来防止同时发生两个进程
  3. 在file_get_contents上,将标头的时间限制设置为2或3秒,否则服务器可能有各种进程什么也不等待
  4. 您可能需要使用set_time_limit(90);尝试防止服务器在睡眠前中断功能

这是一个解决方案,不是一个好的解决方案,它可能会被服务器阻止。使用外部cron可以设置一个简单的功能,服务器每5分钟使用一次其资源。使用此解决方案,服务器将一直使用其上的资源。


0

@johano的答案正确地说明了如何为WP cron作业设置自定义间隔。但是,第二个问题没有得到回答,这是如何每分钟运行一次cron:

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

    define('DISABLE_WP_CRON', true);
  2. 添加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),您应该能够实现目标。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.