我正在尝试在安排一些动作事件后立即运行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);
}
问题在于,当其中一个任务很繁重时,似乎WordPress没有在wp-cron.php
的一次调用中完成所有任务。我猜测$ _GET值doing_wp_cron
与我查看核心文件的代码有关,
其中一条评论说
使用全局$ doing_wp_cron锁,否则使用GET锁。如果没有锁定,请尝试抓住新锁。
我不完全明白这是什么。我想做的是立即执行多个计划任务,而不需要打开另一个页面,无论任务的沉重程度如何。
感谢您提供的信息。
答案 0 :(得分:4)
这应该可以胜任。
<?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);
}
答案 1 :(得分:3)
为什么要重建本机调度程序?这应该有效:
function my_job() {
// heavy lifting
}
add_action( 'my_hook', 'my_job' );
wp_schedule_single_event( time(), 'my_hook', array( 'my_arg' ) );
spawn_cron();
答案 2 :(得分:1)
尝试将超时更改为30秒。
wp_remote_post( $cron_url, array( 'timeout' => 30, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
答案 3 :(得分:0)
我不太明白为什么你要使用cron,如果你只安排一个事件并希望它立即运行 - 你为什么不执行这个动作呢?
do_action('my_action1');
do_action('my_action2');
无论如何,每次访问页面时,Wordpress都会自动运行任何过期的crons,所以我认为没有理由手动调用wp-cron。
关于你的
当其中一个任务很重时,似乎WordPress没有在wp-cron.php的一次调用中完成所有任务
评论,知道默认情况下,如果花费的时间超过30秒,PHP会杀死脚本(包括Wordpress crons)的执行。所以说你有5个crons安排,每个运行9秒钟。前3个将运行,但最后两个不会运行(PHP将在第4个开始后不久死亡)。我已经使用了PHP的set_time_limit
函数,结果很好,允许我的服务器在wordpress cron中执行非常大的cURL请求。
还有一些事情:
add_action
do_action