我也有一个类似的问题需要解决,因为这是插件开发,所以会弄乱wp配置。php或使用WP-CLI不是选项。我决定如下。
我的计划任务运行一个调用异步操作的函数,通过wp_remote_post
.
if ( ! wp_next_scheduled( \'my_long_running_event\' ) ) {
wp_schedule_event( $start_time, $recurrence, \'my_long_running_event\' );
}
add_action( \'my_long_running_event\', \'invoke_my_long_running_function\' );
function invoke_my_long_running_function() {
$nonce = wp_create_nonce( \'my_nonce\' . \'my_action\' );
$url = admin_url( \'admin-post.php\' );
$args = array(
\'method\' => \'POST\',
\'timeout\' => 5,
\'redirection\' => 5,
\'blocking\' => false,
\'headers\' => array(),
\'body\' => array(
\'action\' => \'my_long_running_action\',
\'my_nonce\' => $nonce,
),
);
return wp_remote_post( $url, $args );
}
最重要的部分是
\'blocking\' => false
因为这会异步运行操作。
nonce的使用是可选的,但有助于防止直接调用长时间运行的函数。如果您需要在日程安排之外打电话,请打电话给您的对等人员invoke_my_long_running_function()
相反
然后,您需要一个admin\\u post-action挂钩来实际/最终运行您的函数。
add_action( \'admin_post_nopriv_my_long_running_action\', \'my_long_running_function\' );
使用
nopriv
不理想,但计划的作业未经过身份验证,因此
nopriv
是必需的,否则操作将无法运行。
当然,你还需要my_long_running_function
.
function my_long_running_function() {
// Do the heavy work here.
}