热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Wordpress性能优化:使用crontab+wp-cli代替wp-cron

wp-cron的问题Wordpress内置wp-cron的模块,可以用来执行定时任务,比如定时检查更新,定时发布文章等都需要用到,属于必备功能。但是该模块的特点是:它

wp-cron的问题
    Wordpress内置wp-cron的模块,可以用来执行定时任务,比如定时检查更新,定时发布文章等都需要用到,属于必备功能。 但是该模块的特点是:它只能在用户发起请求时检查定时任务。这个特点导致了一个问题:没有用户访问时,那定时任务就得不到执行;有用户访问时,某个用户会因为定时任务在执行而响应很慢甚至超时。因此,在生产环境下使用wp-cron是不明智的。
    更好的做法是开启一个独立的进程执行这些定时任务——这里使用crontab + wp-cli实现这种做法。(如果你不使用wp-cli,也可以,但是wp-cli,但是在有wp-cli的情况下,你可以方便地查看各个任务的具体执行情况,和对任务做精确的控制。没有命令行工具的情况下就有点要靠猜了)
两步完成优化
1.禁用wp-cron:修改wp-config.php,设置DISABLE_WP_CRON为true:
define('DISABLE_WP_CRON', true);
2.通过crontab定期执行任务
添加以下任务到crontab中(每分钟检查过期任务,如果有就执行)
* * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null
就是这么简单。 
如何判断定时任务正常执行?
1.首先确认crontab有正常调用你的命令
查看下cron的日志:  tail /var/log/cron,看到类似如下的日志说明crontab有在正常调用命令。
Dec  7 11:40:01 aliyun CROND[9189]: (liu) CMD (cd /var/www/html && /usr/local/bin/wp  cron event run --due-now > /dev/null)
Dec  7 11:40:01 aliyun CROND[9190]: (liu) CMD (/usr/lib64/sa/sa1 1 1)
Dec  7 11:41:01 aliyun CROND[9285]: (liu) CMD (cd /var/www/html && /usr/local/bin/wp  cron event run --due-now > /dev/null)
2.然后确认你的命令有正确执行
两种方法:
一、可以去掉`> /dev/null`,这样每次crontab执行的输出都会写入邮件,通过mail命令可以看到每次的执行结果。 
二、另外一种判断方法是,通过wp cron event list判断,下面着重讲这个方法。
如下示例,你会看到有一些任务的next_run_relative为now,它们表示这些任务该执行了。如果你过了1分钟再查看,它们的状态都没变化,说明任务并没有得到执行。
$wp cron event list
+------------------------------------------+---------------------+-----------------------+------------+
| hook                                     | next_run_gmt        | next_run_relative     | recurrence |
+------------------------------------------+---------------------+-----------------------+------------+
| jetpack_display_posts_widget_cron_update | 2018-12-06 10:48:49 | now                   | 10 minutes |
| jetpack_sync_cron                        | 2018-12-06 10:48:55 | now                   | 5 minutes  |
| jetpack_sync_full_cron                   | 2018-12-06 10:48:55 | now                   | 5 minutes  |
| jp_sitemap_cron_hook                     | 2018-12-06 10:52:42 | 1 minute 59 seconds   | 12小时     |
| jetpack_clean_nonces                     | 2018-12-06 11:08:49 | 18 minutes 6 seconds  | 1小时      |
。。。
+------------------------------------------+---------------------+-----------------------+------------+
反之,如果任务得到了执行,那些为`now`的状态应该会变掉,如下面的结果所示:
$wp  cron event list
+------------------------------------------+---------------------+-----------------------+------------+
| hook                                     | next_run_gmt        | next_run_relative     | recurrence |
+------------------------------------------+---------------------+-----------------------+------------+
| jetpack_sync_cron                        | 2018-12-07 03:53:55 | 41 seconds            | 5 minutes  |
| jetpack_sync_full_cron                   | 2018-12-07 03:53:55 | 41 seconds            | 5 minutes  |
| jetpack_display_posts_widget_cron_update | 2018-12-07 03:58:49 | 5 minutes 35 seconds  | 10 minutes |
| jetpack_clean_nonces                     | 2018-12-07 04:08:49 | 15 minutes 35 seconds | 1小时      |
。。。
+------------------------------------------+---------------------+-----------------------+------------+

 

配置过程中碰到的问题
Q:执行wp cron event run --due-now时,可能出现下面的提示:
PHP Notice: Undefined index: HTTP_HOST
A:在wp-config.php中添加
if (defined('WP_CLI') && WP_CLI) {
     $_SERVER['HTTP_HOST'] = 'localhost';
}
参考文档: https://github.com/wp-cli/wp-cli/issues/4073

推荐阅读
  •   crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执 ... [详细]
  • 想到一个问题,如果在crontab里有个定时任务设置为一分钟执行一次,但是它执行的时间可能会超过一分钟,此时crontab一分钟后会再次运行该脚本吗?这样会不会出现冲突呢?网上找了下,说可以用Linu ... [详细]
  • 启动服务#servicecrondstart或者#etcinit.dcrondstart格式:*  *  *  *  *  command分 时 日 月 周  ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 650)this.srchtt ... [详细]
  • 服务器上的nginx使用logrotate来分割日志,设置为每天分割。但是logrotate似乎没有工作,日志并没有分割。服务器是CentOS6。为了找到原因 ... [详细]
  • #!binbash########################################################################## File Name : rsync_nobody.sh#  ... [详细]
  • 用.sh文件来完成任务,但现在有个项目直接用url就行。一般系统不会有crontabShell#安装crontab:yuminstallcronta ... [详细]
  • 1crond服务未启动crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 一·计划任务1)at1.确定at安装chkconfig–list|grepatd启动at服务:serviceatdrestart2.访问控制如果系统中有etc ... [详细]
  • Linux下浅谈crond与crontab的命令用法
    一、什么是crond?crond是Linux系统用来定期执行命令或指定程序的服务的一种服务或软件。一般情况下当我们安装完成Linux操作系统之后,默认便会启动 ... [详细]
  • 前言crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较 ... [详细]
author-avatar
小何775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有