Cron计划任务

Cron

什么是 WP-Cron

WP-Cron 是 WordPress 处理调度基于时间的任务的方式。WordPress 的一些核心功能(例如检查更新和发布预定帖子)都利用了 WP-Cron。名称中的“Cron”部分来自 UNIX 系统上可用的基于时间的 cron 任务调度系统。

WP-Cron 的工作原理是在每次页面加载时检查计划任务列表,以查看需要运行的任务。任何由于运行而产生的任务都将在该页面加载期间被调用。

笔记:WP-Cron 并不像系统 cron 那样持续运行;它仅在页面加载时触发。

如果您将任务安排在下午 2:00,并且直到下午 5:00 才会发生页面加载,则可能会出现安排错误。

为什么使用 WP-Cron

 

了解 WP-Cron 调度

与在特定时间安排任务的传统系统 cron 不同(例如“每小时的整点后 5 分钟”),WP-Cron 使用间隔来模拟系统 cron。

WP-Cron 有两个参数:第一个任务的时间,以及重复该任务的时间间隔(以秒为单位)。例如,如果您计划任务在下午 2:00 开始,时间间隔为 300 秒(五分钟),则该任务将首先在下午 2:00 运行,然后在下午 2:05 再次运行,然后在下午 2:10 再次运行,并且依此类推,每五分钟一次。

为了简化计划任务,WordPress 提供了一些默认间隔和添加自定义间隔的简单方法。

WordPress 提供的默认间隔是:

自定义间隔

要添加自定义间隔,您可以创建一个过滤器,例如:


add_filter( 'cron_schedules', 'example_add_cron_interval' );
function example_add_cron_interval( $schedules ) { 
    $schedules['five_seconds'] = array(
        'interval' => 5,
        'display'  => esc_html__( 'Every Five Seconds' ), );
    return $schedules;
}

这个过滤器函数创建了一个新的间隔,允许我们每五秒运行一次 cron 任务。

注意:所有间隔均以秒为单位。

调度 WP Cron 事件

WP Cron 系统使用钩子来添加新的计划任务。

添加钩子

为了让您的任务运行,您必须创建自己的自定义挂钩,并为该挂钩指定要执行的函数的名称。这是非常重要的一步。忘记它,你的任务将永远不会运行。

以下示例将创建一个钩子。第一个参数是您正在创建的钩子的名称,第二个参数是要调用的函数的名称。


add_action( 'bl_cron_hook', 'bl_cron_exec' );
笔记:请记住,函数名称的“bl_”部分是函数前缀您可以在此处了解前缀为何如此重要。

笔记:您可以在此处阅读有关操作的更多信息。

安排任务

需要注意的是,WP-Cron 是一个简单的任务调度程序。众所周知,任务是通过创建的钩子添加的,该钩子是为了调用运行所需任务的函数而创建的。但是,如果多次调用wp_schedule_event(),即使使用相同的挂钩名称,该事件也会被安排多次。如果您的代码在每次页面加载时添加任务,则可能会导致该任务被调度数千次。这不是你想要的。

WordPress 提供了一个名为wp_next_scheduled()的便捷函数 来检查特定的钩子是否已被调度。wp_next_scheduled()采用一个参数,即钩子名称。它将返回一个包含下一次执行的时间戳的字符串,或者返回 false,表示该任务未安排。它的使用方式如下:


wp_next_scheduled( 'bl_cron_hook' )

安排重复任务是通过wp_schedule_event()完成的。该函数采用三个必需参数和一个附加参数,该参数是一个可以传递给执行 wp-cron 任务的函数的数组。我们将重点关注前三个参数。参数如下:

  1. $timestamp– 该任务第一次执行的 UNIX 时间戳
  2. $recurrence– 任务重复执行的时间间隔名称(以秒为单位)
  3. $hook– 我们要调用的自定义挂钩的名称

我们将使用此处创建的 5 秒间隔和上面创建的挂钩,如下所示:


wp_schedule_event( time(), 'five_seconds', 'bl_cron_hook' );

请记住,我们需要首先确保任务尚未安排。所以我们将调度代码包装在一个检查中,如下所示:


if ( ! wp_next_scheduled( 'bl_cron_hook' ) ) {
    wp_schedule_event( time(), 'five_seconds', 'bl_cron_hook' );
}

取消计划任务

当您不再需要计划的任务时,您可以使用wp_unschedule_event()取消计划任务 。该函数采用以下两个参数:

  1. $timestamp– 下一次任务发生的时间戳
  2. $hook– 要调用的自定义钩子的名称

此函数不仅会取消安排由时间戳指示的任务,还会取消安排该任务的所有未来发生。由于您可能不知道下一个任务的时间戳,因此还有另一个方便的函数wp_next_scheduled() 可以为您找到它。wp_next_scheduled()采用一个参数(我们关心的):

  1. $hook– 执行任务时调用的钩子的名称

将它们放在一起,代码如下所示:


$timestamp = wp_next_scheduled( 'bl_cron_hook' );
wp_unschedule_event( $timestamp, 'bl_cron_hook' );

当您不再需要任务时取消计划任务非常重要,因为 WordPress 将继续尝试执行这些任务,即使它们不再使用(或者甚至在您的插件已停用或删除之后)。需要记住取消任务安排的一个重要位置是插件停用时。

不幸的是,WordPress.org 插件目录中有许多插件无法自行清理。如果您发现这些插件之一,请告知作者更新其代码。WordPress 提供了一个名为register_deactivation_hook()的函数 ,允许开发人员在插件停用时运行某个函数。设置非常简单,如下所示:


register_deactivation_hook( __FILE__, 'bl_deactivate' ); 

function bl_deactivate() {
    $timestamp = wp_next_scheduled( 'bl_cron_hook' );
    wp_unschedule_event( $timestamp, 'bl_cron_hook' );
}

笔记:您可以在此处阅读有关激活和停用挂钩的更多信息。

 

 

将 WP-Cron 挂接到系统任务计划程序中

如前所述,WP-Cron 不会连续运行,如果有必须按时运行的关键任务,这可能会成为一个问题。有一个简单的解决方案。只需将系统的任务调度程序设置为按您希望的时间间隔(或在需要的特定时间)运行即可。最简单的解决方案是使用工具向文件发出 Web 请求wp-cron.php

在系统上安排任务后,还需要完成一个步骤。WordPress 将在每次页面加载时继续运行 WP-Cron。这不再是必要的,并且会导致服务器上额外的资源使用。可以在文件中禁用 WP-Cron wp-config.php。打开wp-config.php文件进行编辑并添加以下行:


define( 'DISABLE_WP_CRON', true );

视窗

Windows 将其基于时间的调度系统称为任务调度程序。可以通过控制面板中的管理工具访问它。

设置任务的方式因服务器设置而异。一种方法是使用 PowerShell 和基本任务。创建基本任务后,可以使用以下命令调用 WordPress Cron 脚本。


powershell "Invoke-WebRequest http://YOUR_SITE_URL/wp-cron.php"

MacOS 和 Linux

Mac OS X 和 Linux 都使用 cron 作为基于时间的调度系统。通常是使用命令从终端进行访问crontab -e。应该注意的是,任务将以普通用户或 root 身份运行,具体取决于运行命令的系统用户。

Cron 有一个需要遵循的特定语法,包含以下部分:

如果无论哪个时间段都应运行命令,则应使用星号 (*)。例如,如果您想每 15 分钟运行一次命令,无论小时、日期或月份,它会如下所示:


*/15 * * * * command

许多服务器已wget安装,这是一个调用 WordPress Cron 脚本的简单工具。


wget --delete-after http://YOUR_SITE_URL/wp-cron.php
笔记:注意:如果没有 –delete-after 选项,wget 将保存 HTTP GET 请求的输出。

每天晚上午夜触发的对站点 WordPress Cron 的每日调用可能类似于:


0 0 * * * wget --delete-after http://YOUR_SITE_URL/wp-cron.php
 

WP-Cron 测试

WP-CLI

可以使用WP-CLI测试 Cron 作业。wp cron event list它提供了和等命令wp cron event run {job name}查看文档以获取更多详细信息。

WP-Cron 管理插件

WordPress.org 插件目录上提供了多个插件,用于查看、编辑和控制站点上计划的 cron 事件和可用计划。

_get_cron_array()

_get_cron_array()函数返回所有当前计划的 cron 事件的数组。如果您需要检查事件的原始列表,请使用此函数。

wp_get_schedules()

wp_get_schedules()函数返回可用事件重复计划的数组。如果您需要检查可用计划的原始列表,请使用此功能。