【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.pswp.cn/news/36607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36607.shtml
英文地址,請注明出處:http://en.pswp.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;僅保留編號&#…