WordPress站点根目录下有一个wp-cron.php文件,用于定期执行WP core、插件或用户定义的任务。
说到定时任务,大家首先会想到crontab。那么,为什么WP不直接调用Linux的crontab呢?
其实WP这样做是有原因的,它作为全球最流行的CMS,需要运行在多种不同的系统环境下。例如有些服务器上是Linux系统,而有些是Windows Server,并非所有环境都支持crontab,所以就产生了wp-cron这样的通用解决方案。
既然已经有预设的通用方案,我们为什么要用crontab替代wp-cron?
- wp-cron依赖于PHP环境,容易受其他WP插件和配置的影响而导致计划任务失败;
- 每当用户访问前端页面,或者站长访问后台时都会触发wp-cron,大多时候,我们的计划任务不需要频繁执行,wp-cron浪费性能,而crontab就可以很细致地控制计划;
- 大多数WordPress站点采用LNMP或LAMP环境,crontab配置简单,且更加原生和稳定。
WP Super Cache是WordPress市场上最热门的插件之一,从刚接触WP的小白到WP大神都在使用。如果站点文章不算太多的情况下,可以考虑使用“预缓存”模式,提前生成站点页面的HTML文件,从而创造接近于静态网站的速度和体验。不过,用户可能遇到缓存不加载,或者点击“立即加载预缓存”按钮后没有任何反应的情况,这时就要考虑wp-cron是否出现了问题。
基于前文所述的原因,我建议大家禁用wp-cron,然后配置crontab。当然,这么做的前提是你对服务器拥有完全的控制权,如果没有,那么是时候给网站博客搬家了,推荐购买阿里云ECS,点此查看最新活动优惠 。
首先,在wp-config.php文件末尾添加语句:
/* Disable background wp-cron */ define('DISABLE_WP_CRON', true);
接着,编辑crontab规则:
# 编辑规则 crontab -e # 加入规则,注意将网址更改为你自己的域名 # 推荐每10分钟执行一次,可以按需更改 */10 * * * * curl https://www.idcbuy.net/wp-cron.php > /dev/null 2>&1 # 保存规则 # 查看规则是否添加成功 crontab -l # 重新加载crontab让计划生效 systemctl restart crond
添加计划任务之后,如何判断它是否正常执行呢?我们可以查看crontab的log,以CentOS为例:
cat /var/log/cron
crontab为何能够替代wp-cron呢?因为crontab可以定时访问站点根目录下的wp-cron.php文件,用来模拟WordPress自动访问该文件。WP Super Cache的预缓存模式一次缓存100个页面,下次计划任务执行时再缓存一轮,如此直到缓存数量达到用户设置的值。
采取预缓存模式后,访客和搜索引擎的爬虫都可以第一时间获得缓存页面,对于用户体验和SEO都是很有助益的。