使用 WP-CLI 调试 WP-Cron

WP CLI for Cron DB feature image 1540x888 1

这是一个常见的情况。你安排了在凌晨 2 点进行备份,但第二天登录时,文件却不在那里。或者也许是一篇定时发布的文章错过了发布时间,留下了“错过计划”的错误。

根本原因通常是 WordPress cron 系统。与严格按时间运行的系统 cron 不同,WP-Cron 是一个伪 cron。它依赖页面访问来触发计划任务。如果没有人访问网站,任务就不会运行。如果访问者在后台任务堆积时访问站点,他们的页面加载可能会卡住,而 WordPress 正在后台处理队列。

通过 WordPress 仪表盘调试这通常令人沮丧。安装一个插件只是为了查看 cron 事件会增加不必要的负担。一种更直接、更可靠的方法是使用命令行。

WP-CLI 可以立即查看调度器,更重要的是,它可以强制运行事件来查看是否失败。

获取可见性

调试的第一步是查看队列中实际有什么。默认仪表盘对此没有任何洞察,但一个命令可以显示整个计划。

在终端中运行以下命令:

wp cron event list

这会输出一个包含四列的表格:hooknext_run_gmtnext_run_relativerecurrence

调试时最重要的列是 next_run_relative

  • 如果显示“10 minutes”或“1 hour”,则事件计划在未来运行。
  • 如果显示 “now”“1 hour ago”“Yesterday”,则事件卡住了。

“卡住”的事件通常意味着两件事:要么网站没有流量来触发运行器,要么 PHP 脚本尝试运行但静默崩溃了。

神奇修复:强制运行事件

等待可疑任务自然运行是低效的。你需要立即看到错误输出。

无论计划如何,你可以使用 run 命令强制任何事件立即运行:

wp cron event run <hook_name>

例如,如果你的备份 hook 名为 my_daily_backup,则运行:

wp cron event run my_daily_backup

当 WP-Cron 正常运行时(通过页面访问),PHP 错误通常会被抑制或隐藏在你可能没有检查的日志文件中。当你通过 WP-CLI 运行它时,致命错误会直接输出到终端。

如果脚本内存不足或遇到 PHP 超时,命令行会立即告诉你。

清除积压

如果你管理一个离线或被忽视的站点,你可能会发现数十个逾期任务阻塞了队列。与其一个一个运行它们,你可以强制 WordPress 一次处理所有逾期事件:

wp cron event run --due-now

清理垃圾

随着时间的推移,wp_options 表可能会积累孤立的 cron 事件。这些是由已停用或删除错误的插件留下的计划任务。它们不会破坏网站,但确实会混乱数据库和 cron 列表。

要删除特定事件:

wp cron event delete <hook_name>

注意不要删除 WordPress 核心 hook(如 wp_scheduled_deletewp_version_check)。只专注于明显以你不再使用的插件命名的 hook。

替代方案:禁用默认 WP-Cron

对于高流量网站或时间关键的任务,依赖页面访问来触发任务通常是不够的。在这些情况下,通常会禁用默认行为并用系统 cron 替换它。

这涉及两个步骤。首先,在 wp-config.php 中禁用触发器:

define('DISABLE_WP_CRON', true);

这将阻止 WordPress 在每次页面加载时检查计划任务,这可以提高用户的页面加载速度。

但是,一旦禁用,在设置替代触发器之前,什么都不会运行。您必须在服务器的系统 crontab 中添加一个条目,每分钟调用 WP-CLI。

重要提示: 请勿以 root 用户身份运行此命令。WP-CLI 出于安全原因限制 root 用户执行。请将此行添加到您的 Web 服务器用户(通常是 www-data)或您的特定托管用户的 crontab 中:

* * * * * /usr/local/bin/wp cron event run --due-now --path=/var/www/yoursite/ > /dev/null 2>&1

与此命令与标准手动运行相比有三个关键变化:

  1. 完整路径: 我们使用 /usr/local/bin/wp,因为系统 cron 在最小环境中运行,否则可能不知道 wp 命令的位置。
  2. 站点路径: --path 标志确保 WP-CLI 在正确的 WordPress 安装中执行。
  3. 静默输出: 末尾的 > /dev/null 2>&1 可以防止服务器每分钟在任务成功运行时向您发送邮件通知。

此配置可确保计划任务精确按时运行,无论是否有人访问网站。

结论

WP-Cron 不应该被视为开发人员只能祈祷它能正常工作的“黑箱”。将您的工作流程转移到终端可以将这个黑箱变成透明的队列。使用 wp cron event listrun 允许您在几秒内诊断问题,而不是几天,确保您的备份、邮件和定时发布 exactly 在它们应该发生的时间执行。

分享你的喜爱

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注