
这是一个常见的情况。你安排了在凌晨 2 点进行备份,但第二天登录时,文件却不在那里。或者也许是一篇定时发布的文章错过了发布时间,留下了“错过计划”的错误。
根本原因通常是 WordPress cron 系统。与严格按时间运行的系统 cron 不同,WP-Cron 是一个伪 cron。它依赖页面访问来触发计划任务。如果没有人访问网站,任务就不会运行。如果访问者在后台任务堆积时访问站点,他们的页面加载可能会卡住,而 WordPress 正在后台处理队列。
通过 WordPress 仪表盘调试这通常令人沮丧。安装一个插件只是为了查看 cron 事件会增加不必要的负担。一种更直接、更可靠的方法是使用命令行。
WP-CLI 可以立即查看调度器,更重要的是,它可以强制运行事件来查看是否失败。
获取可见性
调试的第一步是查看队列中实际有什么。默认仪表盘对此没有任何洞察,但一个命令可以显示整个计划。
在终端中运行以下命令:
wp cron event list
这会输出一个包含四列的表格:hook、next_run_gmt、next_run_relative 和 recurrence。
调试时最重要的列是 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_delete 或 wp_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
与此命令与标准手动运行相比有三个关键变化:
- 完整路径: 我们使用
/usr/local/bin/wp,因为系统 cron 在最小环境中运行,否则可能不知道wp命令的位置。 - 站点路径:
--path标志确保 WP-CLI 在正确的 WordPress 安装中执行。 - 静默输出: 末尾的
> /dev/null 2>&1可以防止服务器每分钟在任务成功运行时向您发送邮件通知。
此配置可确保计划任务精确按时运行,无论是否有人访问网站。
结论
WP-Cron 不应该被视为开发人员只能祈祷它能正常工作的“黑箱”。将您的工作流程转移到终端可以将这个黑箱变成透明的队列。使用 wp cron event list 和 run 允许您在几秒内诊断问题,而不是几天,确保您的备份、邮件和定时发布 exactly 在它们应该发生的时间执行。




