【WordPress】给你一万个不使用WP-Cron定时机制的理由

这篇文章也可以在我的博客中查看

定时任务

cron

Cron是Unix/Linux系统中的任务调度工具,允许用户在预定的时间和日期间隔自动运行命令或脚本
它通过Cron表达式定义任务执行的频率,该表达式包含分钟、小时、日期等信息

我们可以利用Cron来定期执行维护、备份、数据处理等编程任务,无需手动干预

wp-cron

wp-cron是WordPress用于装作cron的工具

这个打着cron名号的东西完全跟cron没有关系,而且不可靠

为什么需要wp-cron

不不不,你不会想要它的

以下为官方的狡辩:

  1. WordPress核心和许多插件需要调度系统来执行基于时间的任务
    然而,许多托管服务是共享的,并且不提供对系统调度程序的访问
  2. 使用WordPress API设置定时任务,比在WordPress之外使用系统调度程序更简单
  3. 使用系统调度程序时,如果时间流逝而任务未运行,将不会重新尝试运行任务
    而使用WP-Cron,所有预定的任务都被放入队列中,并将在下一个机会(即下一次页面加载)时运行
    因此,虽然您无法百分之百确定您的任务将在何时运行,但可以百分之百确定它最终会运行。

是啊,cron可能是有缺点,但wp-cron绝对没有任何优点

为什么不需要wp-cron

不是必须的

我的站点在不知情情况下,从来没成功启动过wp-cron
没有它倒也没出现任何问题😅

假调度

我们需要调度系统,但wp-cron根本不是调度系统

由于php脚本执行的特点,只有访问时才会执行一遍脚本
因此WordPress是没有守护进程的

所以你猜wp-cron怎么做到在任务时间到达时自己唤醒自己?
它做不到

它的执行逻辑是:

  1. 在页面访问时顺便检测是否有逾期任务
  2. 如有,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')
理想情况下,它会:

  1. 根据站点site_url设置,域名解析
  2. 域名解析到本机IP地址
    • 缓存解析结果,避免短期重复解析
  3. 识别为本机地址,走环回

OK这种情况虽然偶尔访问了一次公网(域名解析),但还是可以接受的
但问题是,如果使用了CDN呢?

CDN请求

如果你使用了Cloudflare等CDN,代理你服务器的请求
那不好意思,每次请求都是一次完美的脱裤子放屁哦_

  1. 根据站点site_url设置,域名解析
  2. 域名解析到CDN地址
  3. CDN转发请求到你的服务器(本机)
  4. 最终交给WordPress,终于能够开始执行wp-cron任务……
  5. 执行完任务,它还得返回结果……
  6. 结果又经过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. */

把它送走

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL表的增删查改

目录 一,新增 二,查询 2.1 全列查询 2.2 指定列查询 2.3 查询字段为表达式 2.4 别名 - as 2.5 去重 - distinct 2.6 排序 - order by 2.7 条件查询 - where 2.8 分页查询 - limit 三,修改 - update 四,删除 - delete 一…

@Mapper POJO 与DTO之间的class属性转换映射

Mapper注解基于mapStract 框架实现对象转换&#xff1a;MapStract java bean 属性转换映射 引用转自&#xff1a;org.mapstruct:mapstruct 包&#xff08;Mapper、Mapping&#xff09;的使用 依赖包&#xff1a; <!--mapStruct依赖--> <dependency><groupId&g…

Spring-2-透彻理解Spring 注解方式创建Bean--IOC

今日目标 学习使用XML配置第三方Bean 掌握纯注解开发定义Bean对象 掌握纯注解开发IOC模式 1. 第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1.1 XML管理Druid连接池(第三方Bean)对象【重点】 数据库准备 -- 创建数据库 create …

纯前端 -- html转pdf插件总结

一、html2canvasjsPDF&#xff08;文字会被截断&#xff09;&#xff1a; 将HTML元素呈现给添加到PDF中的画布对象&#xff0c;不能仅使用jsPDF&#xff0c;需要html2canvas或rasterizeHTML html2canvasjsPDF的具体使用链接 二、html2pdf&#xff08;内容显示不全文字会被截断…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目录 [RoarCTF 2019Online Proxy]sql巧妙盲注解题脚本脚本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解题 在源代码界面发现&#xff1a;Current Ip 我们会联想到&#xff1a;X-Forwarded-For来修改ip&#xff1a; 结果我们发现&#xff0c;response会讲Last Ip回显出…

Semaphore 原理分析

分析下SemaPhore吧&#xff0c;也是基于AQS实现的&#xff0c;对并发进行控制的工具类&#xff0c;看下其怎么实现的&#xff0c; Semaphore semaphore new Semaphore(3);semaphore.acquire();semaphore.release();Semaphore 常用于控制并发量&#xff0c;比如这里设置为3&…

请教电路高手帮忙Review一下是否可行?

想要实现STM32 3.3V GPIO 控制5V电源通断&#xff0c;默认状态为&#xff1a;接通。 使用如下电路图有无问题&#xff1f;参数是否需要调整&#xff1f;

8.14 ARM

1.练习一 .text 文本段 .global _start 声明一个_start函数入口 _start: _start标签&#xff0c;相当于C语言中函数mov r0,#0x2mov r1,#0x3cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0stop: stop标签&#xff0c;相当于C语言中函数b stop 跳转到stop标签下的第一条…

C++的IO流

C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来…

javaScript:如何获取html中的元素对象

目录 前言&#xff1a; 方法 1.通过id获取元素 2.通过标签名获取元素 3.通过类名class获取元素 获取body的方法 1.document.getElementsByTagName(body)[0] 2.document.body 相关代码 前言&#xff1a; 通过获取HTML中的元素对象&#xff0c;JavaScript可以对网页进行动…

学生成绩管理系统V1.0

某班有最多不超过30人&#xff08;具体人数由键盘输入&#xff09;参加某门课程的考试&#xff0c;用一维数组作函数参数编程实现如下学生成绩管理&#xff1a; &#xff08;1&#xff09;录入每个学生的学号和考试成绩&#xff1b; &#xff08;2&#xff09;计算课程的总分…

Vue [Day7]

文章目录 自定义创建项目ESlint 代码规范vuex 概述创建仓库向仓库提供数据使用仓库中的数据通过store直接访问通过辅助函数 mapState&#xff08;简化&#xff09;mutations传参语法(同步实时输入&#xff0c;实时更新辅助函数 mapMutationsaction &#xff08;异步辅助函数map…

IntelliJ IDEA 2021/2022关闭双击shift全局搜索

我这里演示的是修改&#xff0c;删除是右键的时候选择Remove就好了 IDEA左上角 File-->Settings 找到Navigate -->Search Everywhere &#xff0c;右键添加快捷键。 OK --> Apply应用

C语言学习之const关键字的使用

const修饰变量&#xff1a;const关键字修饰变量时&#xff0c;该变量表示是一个只读变量&#xff0c;不能通过变量名修改变量的值&#xff1b;案例&#xff1a; const int m 20; int const n 30; m 30;//不可以赋值&#xff0c;因为m是只读变量 n 20;//不可以赋值&#xf…

初始多线程

目录 认识线程 线程是什么&#xff1a; 线程与进程的区别 Java中的线程和操作系统线程的关系 创建线程 继承Thread类 实现Runnable接口 其他变形 Thread类及其常见方法 Thread的常见构造方法 Thread类的几个常见属性 Thread类常用的方法 启动一个线程-start() 中断…

前端食堂技术周刊第 93 期:7 月登陆 Web 平台的新功能、Node.js 工具箱、Nuxt3 开发技巧、MF 重构方案

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;橙橙冰萃美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来…

Android多屏幕支持-Android12

Android多屏幕支持-Android12 1、概览及相关文章2、屏幕窗口配置2.1 配置xml文件2.2 DisplayInfo#uniqueId 屏幕标识2.3 adb查看信息 3、配置文件解析3.1 xml字段读取3.2 简要时序图 4、每屏幕焦点 android12-release 1、概览及相关文章 AOSP > 文档 > 心主题 > 多屏…

如何利用DeepBook自动做市商(AMM),发挥应用的最大价值

尽管Sui宣布DeepBook作为其首个本地流动性层&#xff0c;即中央限价单簿&#xff08;Central Limit Order Book&#xff0c;CLOB&#xff09;&#xff0c;但自动做市商&#xff08;Automated Market Maker&#xff0c;AMM&#xff09;平台也可以在Sui上发挥作用。事实上&#x…

理解jvm之对象已死怎么判断?

目录 引用计数算法 什么是引用 可达性分析算法&#xff08;用的最多的&#xff09; 引用计数算法 定义&#xff1a;在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1…

文件批量改名高手:轻松删除文件名,仅保留编号!

您是否经常需要对大量文件进行命名调整&#xff1f;是否为繁琐的手动操作而感到厌烦&#xff1f;现在&#xff0c;我们的智能批量文件改名工具为您提供了一种简单而高效的解决方案&#xff01;只需几步操作&#xff0c;您就能轻松删除原有的文件名&#xff0c;仅保留编号&#…