立即在WordPress中运行预定的WP Cron任务

Ten*_*eno 2 php wordpress cron wordpress-plugin

我正在尝试在安排一些操作事件后立即运行WordPress cron任务。通常,WordPress Cron至少需要加载另一个页面才能触发计划的任务。我正在尝试马上做。我几乎设法做到了,如下面的代码所示。

/* Plugin Name: Sample Cron Immediate Execution  */

add_action('admin_menu', 'sample_cron_immediate_execution');
function sample_cron_immediate_execution() {
    add_options_page(
        'Sample Cron Immediate Execution', 
        'Sample Cron Immediate Execution', 
        'manage_options',
        'sample_cron_immediate_execution', 
        'sample_cron_immediate_execution_admin');
}
function sample_cron_immediate_execution_admin() {
    ?>
    <div class="wrap">
    <?php
        wp_schedule_single_event(time(), 'my_action1');
        wp_schedule_single_event(time(), 'my_action2');
        $cron_url = site_url( 'wp-cron.php?doing_wp_cron=0');
        wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
        echo 'cron tasks should be executed by now.';
    ?>
    </div>
    <?php
}

add_action('my_action1', 'myeventfunc1'); 
function myeventfunc1() {
    sleep(10); // assuming it's a heavy task 
    sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent1_log.html');
}

add_action('my_action2', 'myeventfunc2');    
function myeventfunc2() {
    sleep(10); // assuming it's a heavy task 
    sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent2_log.html');
}

function sample_log($time, $file) {
    file_put_contents($file, $time . '<br />', FILE_APPEND);
}
Run Code Online (Sandbox Code Playgroud)

问题在于,当其中一项任务很繁重时,WordPress似乎无法一次调用完成所有任务wp-cron.php。我猜$ _GET的值doing_wp_cron与我查看核心文件的代码有关,

评论之一说

使用全局$ doing_wp_cron锁,否则使用GET锁。如果没有锁,请尝试获取新锁。

我不完全了解这是什么。我想做的是立即执行多个计划的任务,而无需考虑任务的繁重程度而无需打开另一个页面。

感谢你的信息。

小智 7

为什么要重建本机调度程序?这应该有效:

function my_job() {
    // heavy lifting
}
add_action( 'my_hook', 'my_job' );

wp_schedule_single_event( time(), 'my_hook', array( 'my_arg' ) );
spawn_cron();
Run Code Online (Sandbox Code Playgroud)


小智 5

这应该做的工作。

<?php
    /* Plugin Name: Sample Cron Immediate Execution  */

    add_action('admin_menu', 'sample_cron_immediate_execution');
    function sample_cron_immediate_execution() {
        add_options_page(
            'Sample Cron Immediate Execution', 
            'Sample Cron Immediate Execution', 
            'manage_options',
            'sample_cron_immediate_execution', 
            'sample_cron_immediate_execution_admin');
    }
    function sample_cron_immediate_execution_admin() {
        ?>
        <div class="wrap">
        <?php
            $cron_url = site_url( '?custom_cron=myeventfunc1');         
            wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
            $cron_url = site_url( '?custom_cron=myeventfunc2');         
            wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
            echo 'cron tasks should be executed by now.';
        ?>
        </div>
        <?php
    }

    add_action('init', 'run_customcron');
    function run_customcron() 
    {
        if (isset($_GET['custom_cron']))
        {
            call_user_func($_GET['custom_cron']);
        }
    }

    function myeventfunc1() {
        sleep(10); // assuming it's a heavy task 
        sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent1_log.html');
    }

    function myeventfunc2() {
        sleep(10); // assuming it's a heavy task 
        sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent2_log.html');
    }

    function sample_log($time, $file) {
        file_put_contents($file, $time . '<br />', FILE_APPEND);
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是非常不安全的-绝对不应允许基于GET参数的值执行任意函数。 (2认同)