团队介绍网站模板,网站建设制作团队,网站需求建设书,卖车网站这篇文章也可以在我的博客中查看
定时任务
cron
Cron是Unix/Linux系统中的任务调度工具#xff0c;允许用户在预定的时间和日期间隔自动运行命令或脚本 它通过Cron表达式定义任务执行的频率#xff0c;该表达式包含分钟、小时、日期等信息
我们可以利用Cron来定期执行维护…这篇文章也可以在我的博客中查看
定时任务
cron
Cron是Unix/Linux系统中的任务调度工具允许用户在预定的时间和日期间隔自动运行命令或脚本 它通过Cron表达式定义任务执行的频率该表达式包含分钟、小时、日期等信息
我们可以利用Cron来定期执行维护、备份、数据处理等编程任务无需手动干预
wp-cron
wp-cron是WordPress用于装作cron的工具
这个打着cron名号的东西完全跟cron没有关系而且不可靠
为什么需要wp-cron 不不不你不会想要它的 以下为官方的狡辩
WordPress核心和许多插件需要调度系统来执行基于时间的任务 然而许多托管服务是共享的并且不提供对系统调度程序的访问使用WordPress API设置定时任务比在WordPress之外使用系统调度程序更简单使用系统调度程序时如果时间流逝而任务未运行将不会重新尝试运行任务 而使用WP-Cron所有预定的任务都被放入队列中并将在下一个机会即下一次页面加载时运行 因此虽然您无法百分之百确定您的任务将在何时运行但可以百分之百确定它最终会运行。
是啊cron可能是有缺点但wp-cron绝对没有任何优点
为什么不需要wp-cron
不是必须的
我的站点在不知情情况下从来没成功启动过wp-cron 没有它倒也没出现任何问题
假调度 我们需要调度系统但wp-cron根本不是调度系统 由于php脚本执行的特点只有访问时才会执行一遍脚本 因此WordPress是没有守护进程的
所以你猜wp-cron怎么做到在任务时间到达时自己唤醒自己 它做不到
它的执行逻辑是
在页面访问时顺便检测是否有逾期任务如有fork一个后台进程处理任务
这会出现什么问题
如果网站访问量很大每次访问都会加载执行wp-cron.php这会增加服务器压力如果网站访问量很少没有其它内置机制可以唤醒wp-cron.php你的定时任务不会按时执行直到有人访问
这是非常严重的问题它本身并不是一个可靠的调度系统 绝对不能依赖它执行时间敏感任务
抽象复制进程 等等你刚刚说fork一个后台进程是怎么做的 在WordPress中并不是通过克隆进程执行的为了执行所有hook它需要重新启动一次php处理函数 所以wordpress的做法是……自己给自己发送一个http请求
不是开玩笑这坨代码切实出现在了WordPress的源码中
$cron_request apply_filters(cron_request,array(url add_query_arg( doing_wp_cron, $doing_wp_cron, site_url( wp-cron.php ) ),key $doing_wp_cron,args array(timeout 0.01,blocking false,/** This filter is documented in wp-includes/class-wp-http-streams.php */sslverify apply_filters( https_local_ssl_verify, false ),),),$doing_wp_cron
);$result wp_remote_post( $cron_request[url], $cron_request[args] );我不知道它为什么非得用这种做法可能是WordPress只有按这种方式才能正常从头启动吧…… 但这就是最致命的问题
昂贵的http请求 相当于DDoS攻击自己 首先http请求是非常昂贵的你试试在for循环里面使用wp_remote_post 即使是访问本机你的页面加载速度也会质的下降 虽然wp_cron只会发送1次wp_remote_post但这做法还是太丑了 昂贵的互联网请求 你以为它只会访问环回地址吗错啦 域名解析请求
我们再来看看wp-cron激活自己时访问的地址site_url(wp-cron.php) 理想情况下它会
根据站点site_url设置域名解析域名解析到本机IP地址 缓存解析结果避免短期重复解析 识别为本机地址走环回
OK这种情况虽然偶尔访问了一次公网域名解析但还是可以接受的 但问题是如果使用了CDN呢
CDN请求
如果你使用了Cloudflare等CDN代理你服务器的请求 那不好意思每次请求都是一次完美的脱裤子放屁哦_
根据站点site_url设置域名解析域名解析到CDN地址CDN转发请求到你的服务器本机最终交给WordPress终于能够开始执行wp-cron任务……执行完任务它还得返回结果……结果又经过CDN返回到了你的服务器……
我受不了了这得多浪费资源啊简直是fork一下自己轰动全世界啊
洗 有没有弥补的可能能不能不访问公网 我很努力地试了但我失败了 稍微分享下吧
改host在服务器中将自己域名解析至127.0.0.1
理论上可行但由于我服务器对Cloudflare开启了客户端SSL证书验证 因此我的访问被自己的服务器驳回了呢_ 但我也不想不顾站点安全而关闭这个功能所以就此开摆吧……
或者有其他地址可以使wp_remote_post直接访问到本机的wp_cron.php文件 但我放弃了 毁灭吧世界
关闭wp-cron
所以告诉我wp-cron到底有什么留存的价值毙了它吧
打开config.php在 That’s all, stop editing! Happy blogging.之前加入
define(DISABLE_WP_CRON, true);/* That’s all, stop editing! Happy blogging. */把它送走