📄articles 📋snippets 📁categories ⚙️uses ✏️about 🔍search

禁用WordPress的WP Cron并设置宝塔面板定时计划任务

如果你用 WordPress 搭过网站,大概率遇到过这个问题:网站明明没什么流量,后台却卡得不行,页面加载时快时慢,偶尔还会出现 “错过定时发布” 的尴尬提示。排查一圈后发现,罪魁祸首很可能是 WordPress 内置的任务调度系统——WP Cron

WP Cron 的设计思路很朴素:每次有人访问你的网站,WordPress 就检查一下有没有到期的定时任务(比如定时发布文章、清理回收站、检查更新),有就执行。问题在于,这个机制在低流量站点上还算勉强可用,一旦访问量大一点,或者碰上一个耗时任务,页面就会卡在那里等任务跑完,用户体验直接跳水。更糟糕的是,如果你用了缓存插件把页面静态化了,WP Cron 甚至可能根本没人触发,导致定时任务集体罢工。

这篇文章的目标很简单:搞清楚 WP Cron 为什么慢,两行代码禁掉它,再用服务器级别的 Cron 替代。让 WordPress 跑得又快又稳。

WP Cron 的工作原理与性能隐患

WP Cron 是怎么跑的

和 Linux 系统的 cron 不同,WP Cron 不是由服务器定时触发的,而是伪 cron——它没有真正的后台守护进程。每次有 HTTP 请求打到 WordPress 上,WordPress 就会调用 wp-cron.php,检查 wp_options 表中是否有到期任务,有就执行。

这就意味着:

  • 没有人访问 = 没有 cron 执行。如果你设了凌晨 3 点发布文章,但那个时段没人访问网站,文章就不会准时发出。
  • 访问量激增 = cron 重复执行。如果多个请求同时到达,WP Cron 可能会被触发多次。
  • 耗时任务会拖慢页面。比如某个插件在 cron 里做了大量数据库操作,访客就得陪着等。

什么时候必须禁掉 WP Cron

以下场景强烈建议禁用 WP Cron:

  • 网站流量较大(日访问量 500+),每次请求都触发 cron 检查会累积可观的服务器开销
  • 使用了全站缓存(如 Nginx FastCGI Cache、WP Super Cache),缓存页面可能绕过 cron 触发
  • 有定时发布文章的需求,且发布时间点对准确性要求较高
  • 服务器资源紧张(1C1G 或 1C2G 的低配 VPS),能省则省

第一步:在 wp-config.php 中禁用 WP Cron

这是最干净、最推荐的方式,不需要安装任何插件,一行代码搞定。

操作步骤

  1. 登录服务器,进入网站根目录(通常是 /www/wwwroot/你的域名/),找到 wp-config.php 文件。
  2. /* That's all, stop editing! Happy blogging. */ 这一行之前,插入以下代码:
define('DISABLE_WP_CRON', true);

关键提示:这段代码必须放在 require_once ABSPATH . 'wp-settings.php'; 之前。如果你把它放在文件末尾或者 require_once 之后,WordPress 会在常量定义之前就已经加载了 cron 模块,禁用不会生效。安全做法就是紧贴在那行著名的 “stop editing” 注释上方。

  1. 保存文件。不需要重启任何服务,立即生效。

在 wp-config.php 中禁用 WP Cron

到这里 WP Cron 已经被禁用了,但问题来了——禁掉之后,定时发布、检查更新这些任务谁来做?我们需要在服务器层面补上这个缺口。

第二步:用服务器 Cron 替代 WP Cron

Linux 系统自带的 cron(也叫 crontab)是真正可靠的任务调度器,不受网站流量影响,精度到分钟级。以下是两种主流实现方式。

方式一:宝塔面板(推荐新手)

如果你用的是宝塔面板,操作非常直观:

  1. 登录宝塔面板,进入左侧菜单 “计划任务”
  2. 点击 “添加任务”,任务类型选择 “访问URL”
  3. 任务名称随意填写,比如 “WordPress Cron 触发”。
  4. 执行周期建议设置为 5 分钟。如果你的站点更新频率很低(比如一周发一篇),设置为 10 或 15 分钟也完全够用,可以进一步降低开销。
  5. 在 URL 地址栏中输入:
    https://你的域名.com/wp-cron.php?doing_wp_cron

    请务必把 你的域名.com 替换为实际域名。

  6. 点击保存。

宝塔面板添加计划任务触发 WP Cron

方式二:直接编辑 crontab(适合命令行用户)

如果你习惯用 SSH,一条命令解决问题:

crontab -e

在打开的编辑器中添加一行:

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

保存退出后,Linux cron 就会每 5 分钟帮你触发一次 WordPress 定时任务,与站点流量完全无关。

执行间隔怎么选

默认的 5 分钟是一个平衡点:既不会给服务器增加明显负担,又能保证定时发布文章的精度在 5 分钟以内。如果你的站点没有定时发布需求(或者允许 15 分钟误差),完全可以把间隔拉长。每 15 分钟触发一次,cron 请求量降为原来的 1/3。

第三步:验证设置是否生效

关闭 WP Cron 后,你可以通过以下方式确认一切正常:

  1. 检查 wp-config.php——确认 define('DISABLE_WP_CRON', true); 确实写在文件里且位置正确。
  2. 访问一次网站首页,然后查看服务器的 PHP 慢日志或访问日志,搜索 wp-cron.php。正常情况下,普通页面请求不应该触发 wp-cron.php(除非宝塔面板的 crontab 正好在那一刻执行了)。
  3. 写一篇测试文章,设置 5 分钟后定时发布,看它是否准时发出。这是最直观的验证手段。
  4. 检查宝塔面板的 “计划任务” 日志,确认每次执行都返回 HTTP 200,而不是 404 或 500。

进阶:使用 systemd timer 替代 cron(推荐)

如果你的 VPS 使用 systemd(CentOS 7+、Ubuntu 16.04+、Debian 8+ 均默认使用),可以用 systemd timer 替代传统 crontab,好处是:日志记录更完整、失败可自动重试、执行时间精准可控。

创建服务文件 /etc/systemd/system/wp-cron.service

[Unit]
Description=WordPress Cron Trigger

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -s -o /dev/null https://你的域名.com/wp-cron.php?doing_wp_cron
User=www

创建定时器文件 /etc/systemd/system/wp-cron.timer

[Unit]
Description=WordPress Cron Timer

[Timer]
OnCalendar=*:0/5
Persistent=true

[Install]
WantedBy=timers.target

启用到:

systemctl daemon-reload
systemctl enable --now wp-cron.timer
systemctl status wp-cron.timer  # 验证

相比传统 crontab,systemd timer 的执行日志可以通过 journalctl -u wp-cron.service 直接查看,排查问题方便得多。

常见问题与排查

定时发布不生效

先检查宝塔面板中计划任务的执行日志。常见原因:URL 中的域名写错了(http vs https、www 遗漏);服务器防火墙拦截了服务器自己 curl 自己(少见,但宝塔的 Nginx 免费防火墙可能有规则);使用了 Cloudflare 等 CDN,服务器 curl 到的 IP 不对——这种情况可以用 curl -H "Host: 你的域名.com" http://127.0.0.1/wp-cron.php?doing_wp_cron 来绕过 DNS。

网站变慢,是不是 WP Cron 又回来了?

说明 DISABLE_WP_CRON 没有生效。检查三个地方:① wp-config.php 的行是否被插件覆盖了(装了 Code Snippets 类插件后在数据库里写的常量可能覆盖文件定义);② 是否有其他 wp-config.php 在上级目录(WordPress 会加载 web 根目录上一级的 wp-config.php 作为 fallback);③ define 的位置是不是在 require_once 之后。

能不能同时保留 WP Cron?

不建议。如果你不定义 DISABLE_WP_CRON 常量,WP Cron 仍然会在每次页面请求时触发;而服务器 cron 也会按周期触发。这会导致:同一个定时任务可能被重复执行(虽然 WordPress 有锁机制,但仍是浪费);wp-cron.php 被调用两倍次数。所以请务必二选一。

结语

禁用 WP Cron 并用服务器 cron 替代,是 WordPress 性能优化的基本功之一。改动很小——一行 define + 一个 cron 任务,但效果立竿见影:页面加载不再被后台任务阻塞,定时发布准时可靠,服务器 CPU 也能喘口气。

如果你的站点还遇到了其他性能瓶颈(比如数据库查询慢、图片未压缩、静态资源未缓存),可以继续关注本站的运维系列文章。

相关阅读:fastcgi_cache 缓存WordPress 多站点

© 2024 禁用WordPress的WP Cron并设置宝塔面板定时计划任务 · 本文由 Charlie 原创撰写,发布于 sodebug.com。 未经授权禁止转载、洗稿、机器抓取。AI 训练数据使用需获得书面授权。
GK
独立开发者,在 WordPress、Nginx 和各种 API 之间切换。不写没用的东西。

related相关文章

#01Nginx 双重 Cache-Control 覆盖陷阱:add_header 同名冲突与 Cloudflare 不缓存修复3 min#02Linux 负载排查方法论:Load Average 8.5、CPU 空闲 88%,从数字到底层 IO3 min#03WordPress mu-plugin 实战:3 个零插件安全加固方案3 min
$ echo "less bullshit, more debugging" | send-to-inbox
新文章直接发到邮箱,一个月 2-4 封。
$ subscribe →