【发布时间】:2023-10-06 01:01:01
【问题描述】:
我正在尝试在安排一些操作事件后立即运行 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 与它有关,
其中一个cmets说
使用全局 $doing_wp_cron 锁,否则使用 GET 锁。如果没有锁,请尝试获取新锁。
我不完全明白这是什么意思。我想做的是立即执行多个计划任务,而无需打开另一个页面,而不管任务的繁重程度。
感谢您的信息。
【问题讨论】:
-
您可以使用“真正的 cron 作业”来启动您的 WP Cron。有什么特别的原因你不做那样的事情吗?我们在几个地方使用了这种方法,它提供了一种强大的解决方案,可以以最小的干扰来缓存内容!
-
这是一个分布式插件。是否所有系统都允许执行 cron 命令?
-
哦,这改变了它,我“希望”它适用于您自己的应用程序。不幸的是,在大多数系统上,您需要在服务器级别运行 cron 命令,您无法真正编写“嘿,WordPress 插件,执行此服务器级别 cron!”的函数。 ://