打开定时任务选项一看,同一个钩子排了几十条记录,执行时间挤在同一分钟,站点隔一会儿就卡一下。乍看像缓存或者权限的锅,追下去往往不是。

if (!wp_next_scheduled('my_task')) {
  wp_schedule_event(time(), 'hourly', 'my_task');
}
# wp cron event list

追下去是这么回事:调度代码直接写在主题文件或 init 回调里,每次请求都会插一条记录,没有先判断这个任务是否已经排过。

「wp_schedule_event 重复注册」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,调度之前先用 wp_next_scheduled 判断是否存在;改挂 after_switch_theme 让它只执行一次;清掉已有的重复事件再重新注册一条任务。

验收就看一点,定时任务列表里该钩子只剩一条,触发间隔恢复正常。

作者 9823189