WordPress Cron 的工作原理

已发表: 2021-12-03

你有没有想过 WP-Cron 是什么? 如果是这样,那么这是您了解有关 WordPress 计划任务的所有信息的完美文章。

Cron (Command Run On) 是一个在 UNIX 系统中启动的实用程序,后来在 LINUX 发行版上演变而来,该发行版被提议作为基于时间的作业调度程序。

cron 作业是重复执行或作为一次性任务执行的任务。 多年来,它主要用作自动运行任务的系统管理工具。

WordPress 定时任务

在运行 WordPress 网站时,一些需要定期执行的任务在后台执行,例如检查主题和插件的更新、预定的帖子、要删除的瞬态等等。 这些基于时间的计划任务由 WP-Cron 处理。

在您的 WordPress 安装中,与 cron 作业相关的文件是wp-cron.php文件,位于安装的根文件夹中。

wp-cron.php 文件包含与更新和帖子相关的自动化任务的代码。

这个怎么运作

WP-Cron 在每次页面加载时检查任务列表并相应地执行。

如果页面加载的那一刻,任务到期,它被添加到队列中。 这样,WordPress 确保即使是到期事件也会被触发而不是被跳过,最终所有任务都将在该页面加载时执行。

如果这对您来说似乎不合理,那是很自然的,但请考虑替代方案。 在大多数情况下,在共享主机环境中,您应该有权访问服务器命令,以便按照您认为合适的方式控制这些任务,但这对服务器来说不会有风险吗?

因此,请考虑 WordPress 在这种情况下的解决方法。 但是,这有一些缺点,我们稍后会检查。

WP-Crontrol 插件

在您的 WordPress 网站中查看 cron 作业列表的一种非常简单的方法是安装 WP-Crontrol 插件。

激活后,您可以在 Tools->Cron Events 菜单项下查看插件的管理页面。 在 vanilla 安装中,您将看到如下内容:

如果您将鼠标悬停在每一行上,您会注意到提供了用于编辑或运行任何事件的操作。

例如,在 wp_update_themes 事件的编辑屏幕中,您可以修改其设置

在 Settings -> Cron Schedules 菜单项下,您可以查看默认计划,如果需要,添加您自己的计划并为其命名以在列表中查看。

如何创建 Cron 作业

要手动添加 cron 作业,您所要做的就是编辑主题的functions.php文件。 为了演示一个简单的示例,请使用您喜欢的编辑器打开它并添加以下代码:

 add_action( 'my_cronjob', 'my_cronjob_function' ); function my_cronjob_function() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); }

其中“my_cronjob”是您的钩子的名称,“my_cronjob_function”是您的函数的名称,该函数将简单地向您定义的地址发送一封电子邮件,方法是将 EMAIL_ADDRESS 替换为所需的地址。

接下来,我们需要安排这个钩子在我们想要的时间执行。

如何运行一次作业

要将操作作为一次性 WP-Cron 作业执行,我们必须使用 wp_schedule_single_event() WordPress 内置函数,该函数旨在在指定时间触发挂钩。 它的结构是这样的:

wp_schedule_single_event( $timestamp, $hook, $args, $wp_error )

其中 $timestamp 是下次运行事件的 Unix 时间戳,$hook 是运行事件时要执行的操作挂钩。

这两个参数都是必需的。 现在让我们谈谈可选参数。

使用 $args 参数,您可以使用包含参数的数组来传递给钩子的回调函数。 数组中的每个值都作为单独的参数传递给回调。 数组键被忽略。

$wp_error 参数可用于在失败时返回 WP_Error。 它的默认值为假。

我们的functions.php文件中的相应代码将是这样的:

 add_action( 'my_cronjob', 'my_cronjob_function' ); function my_cronjob_function() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } wp_schedule_single_event( time() + 3600, 'my_cronjob' );

此时您应该能够在列表中看到您的自定义任务。

如何将作业作为重复事件运行

WordPress 为这种情况提供的是 wp_schedule_event() 函数,其结构如下

wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error)

$timestamp 参数是下一次运行事件时所需的 Unix 时间戳,$recurrence 是一个字符串,也是事件随后应该多久重复一次的字符串,$hook 是事件运行时要执行的动作挂钩。

可选的 $args 和 $wp_error 参数与之前相同。

运行该作业的重复时间为 1 小时的代码是这样的:

 add_action('my_hourly_cronjob', 'hourly_action'); function hourly_action() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } if (! wp_next_scheduled ( 'my_hourly_cronjob' )) { wp_schedule_event(time(), 'hourly', 'my_hourly_cronjob'); }

我们在上面看到的“if”语句中使用了 wp_next_scheduled() 函数,以避免重复事件并确保在继续运行之前尚未安排任务。

我们还使用了 Settings -> Cron Schedules 下计划表中的“每小时”标签。 如果我们想要一个不同的事件,比如说每 45 分钟,我们应该首先创建一个名为“45_minutes”的自定义 Cron 计划,然后在代码中使用它。

 add_action('my_45_cronjob', 'my_45_action'); function my_45_action() { wp_mail( 'EMAIL_ADDRESS', 'Test email', 'This is a test message' ); } if (! wp_next_scheduled ( 'my_45_cronjob' )) { wp_schedule_event(time(), '45_minutes', 'my_45_cronjob'); }

此时,您应该能够在列表中看到您的自定义任务以及预期的更改:

WP-Cron 缺点

WordPress 处理 cron 作业的方式确保任务将运行,但不允许您指定何时运行,因为正如我们所说,检查是在访问者加载您网站的页面时完成的。

如果我们将 cron 作业控制传递给用户的访问时间,那么无论网站的大小或受欢迎程度如何,我们都有可能对网站产生负面影响。

使用 Pressidium 托管您的网站

60 天退款保证

查看我们的计划

以热门网站为例,由于同时执行大量任务,您将体验到大量流量。 这可能会消耗您的服务器资源并影响性能,甚至导致您的网站停机。

对于小型网站,这意味着访问者很少,wp-cron 不会经常被触发,因此一些重要的 cron 作业可能会被推迟足够的时间以产生副作用,例如没有进行足够的备份,或者延迟更新一些计入 cron 作业的数据。

禁用 WP-Cron

如果 WP-Cron 处理 cron 作业的方式不符合您的要求,并且您需要按时执行任务,那么您应该禁用 WP-Cron 并使用服务器端 cron 服务。

如果您的托管服务提供商尚未提供禁用 WP-Cron 的选项,那么您可以自己执行此操作。

使用您喜欢的编辑器打开位于安装根文件夹下的wp-config.php文件,并找到与数据库表前缀相关的行。 紧接着,插入这一行:

 // /** * WordPress Database Table prefix. * * You can have multiple installations in one database if you give each * a unique prefix. Only numbers, letters, and underscores please! */ $table_prefix = 'wN0b9WQk_'; define('DISABLE_WP_CRON', 'true');

如果您想使用更稳定的调度程序,例如 Linux cron 服务,以便在更适合您时触发 wp-cron.php,这是强制性的。

服务器端解决方案: Linux Cron 服务

在 Pressidium,我们使用 Linux Crontab 每 5 分钟触发一次 WP-Cron。 正确的时间量可以确保您的计划作业按时执行,同时避免您的 WordPress 网站超载。 这不会干扰 WP-Cron 调度程序,而只会干扰触发机制。

结论

希望本文能帮助您熟悉 WordPress Cron、它是什么以及它是如何工作的,以及如何创建自己的日程安排和任务。 在选择其他服务器端解决方案之前,请三思而后行 WP-Cron 是否足以满足您的要求。