代码与工具 3 分钟阅读

把 WordPress 定时任务换成系统 cron

为什么想换掉 WordPress 的定时任务(wp-cron)是靠页面访问触发的。没人访问,任务就不跑。我的站流量不大,经常出现 […]

把 WordPress 定时任务换成系统 cron

为什么想换掉

WordPress 的定时任务(wp-cron)是靠页面访问触发的。没人访问,任务就不跑。我的站流量不大,经常出现文章发布了,但定时发布的文章没按时上线,或者备份插件延迟好几个小时才执行。更烦的是,每次有人访问,wp-cron 都会在后台检查一遍任务队列,多少拖慢一点响应。

我决定把它换成系统 cron,让服务器自己按点触发,不依赖访问。

先关掉 wp-cron

第一步是在 wp-config.php 里加一行:

define( 'DISABLE_WP_CRON', true );

加在“/* That's all, stop editing! */”之前就行。这样 WordPress 就不再在页面加载时检查任务了。

改完刷新一下前台,确认没有报错。然后去后台看看“站点健康”,如果提示 wp-cron 被禁用,说明生效了。

配系统 cron

我用的是宝塔面板,直接进“计划任务”加了一条。如果你用命令行,crontab -e 加一行:

*/5 * * * * curl -s https://你的域名/wp-cron.php?doing_wp_cron > /dev/null 2>&1

每 5 分钟触发一次。为什么是 5 分钟?我的定时发布精度要求不高,5 分钟够用,也不会给服务器太大压力。如果你有更实时的需求,可以改成 1 分钟,但注意别把服务器跑满。

这里有个细节:curl 请求要带上正确的 Host,如果站点有 CDN 或者反代,最好直接请求源站 IP,避免被缓存层拦截。我一开始没注意,cron 一直返回 403,后来在命令里加了 –resolve 参数指定源站 IP 才通。

验证和观察

配好之后,我手动跑了一次命令,看返回是不是空的(正常情况 wp-cron.php 不输出内容)。然后去后台装了个 WP Crontrol 插件,查看任务列表,确认所有任务的下次执行时间都在 5 分钟内。

接着等了一个定时发布的任务,到点后文章准时上线。又观察了两天,备份插件也按时跑了,后台不再有“错过计划任务”的提示。

一点感受

换完之后最大的变化是心里踏实了。以前总担心没人访问导致任务堆积,现在服务器自己管自己。wp-cron 本身没什么错,它只是为共享主机设计的妥协方案。如果你的站有独立服务器或者 VPS,换成系统 cron 是更干净的做法。

不过要注意,有些插件依赖 wp-cron 的“伪定时”特性,比如在任务里调用 wp_remote_get 触发其他任务。换之前最好翻一下插件文档,或者先在测试环境跑几天。我这边只用了备份和发布提醒,没遇到兼容问题。

如果你也受够了定时任务不准时,可以花十分钟试试。改一行配置,加一条 cron,就这么简单。

留下你的回声