注意一下:这篇文章所述的内容的适用范围仅限于大型WordPress站点,也就是说只有你的网站每天要处理几百上千的计划任务时才需要看这篇文章。
认识一下WordPress的Cron有哪些不足
- 是一个伪Cron,它通过在用户访问网页的同时发起一个独立HTTP请求的方式来触发Cron。也就是说只有存在用户访问时Cron才会触发。对于大型WordPress站点来说,这意味着每次用户打开一个网页其实等于他开了两个(用户本身的网页+Cron执行URL),于是就导致负载量徒增。一个解决方案是禁止WordPress默认的Cron触发方式,并改为使用WP-Cli配合操作系统的计划任务来触发。
- 使用全局锁,也就是说你同一时刻只能运行一个计划任务,这对有很多待处理队列的站点来说效率非常低
- 一旦遇到PHP执行失败的情况会整个停止掉,其后的所有请求都不会被处理
- 没有错误重试机制,也就是说一旦某个任务一次执行失败就会被略过
- 没有日志记录功能,例如执行中产生的错误都不会被记录,这一条和前面两条合起来就等于“不可靠”
- 相关数据保存在wp_options表中,并被设置为自动加载,也就是说你有1000个计划任务的话,这1000个任务会在每次网页打开时被加载。
Cavalcade的优势
Cavalcade完美解决了上述所有问题,其使用独立数据表保存计划任务,并由独立的队列监控服务进行调用,于是它可以在毫不影响网站性能的情况下并发处理成千上万的计划任务。最重要的是Cavalcade直接接管WordPress的Cron并完全兼容其API,这意味着作为开发者不需要做任何特殊的适配。
此外,wordpress.org也在运行Cavalcade。
安装Cavalcade
参见官方GitHub仓库:https://github.com/humanmade/Cavalcade/tree/master/docs