問題描述

我今天早上收到一封電子郵件,指出我的 WordPress 網站已經被自動更新為最新版本。我知道這個功能,但我一直想知道它是如何工作的。

PHP 不是 permanently-running 程式:它只在請求時執行。所以據我所知,Wordpress 只能在有人載入網頁時自行更新。但更新過程不是即時的,所以訪問該網站的使用者一定會很慢的頁面載入。

有不同的技巧他們用於自動更新?我搜尋了整個地方,但沒有找到任何解釋。

最佳解決方案

PHP isn’t a permanently-running process: it only runs when requested. So as far as I can tell, WordPress can only update itself when someone loads a web page. But the update process is not instantaneous, so surely a user visiting the site would have a really slow page load.

Is there a different trick they use for automatic updates? I’ve searched all over the place but haven’t found any explanation.

您正在尋找的系統稱為”WP Cron” 。它是 WordPress 中的後臺處理系統,它允許事件發生在正常處理之外。他們仍然需要一個觸發器來踢掉它們,但是由於後臺程式,它們不會影響頁面載入。

所以是的,有人必須載入您的頁面。在 default-filters.php 檔案中關閉,你會發現這一行程式碼:

 add_action( 'init', 'wp_cron' );

所以,在每一頁的載入中,wp_cron 函式執行。此功能已在 wp-includes /cron.php 中完成,它的作用是檢查資料庫中的計劃事件。如果有任何程式需要在後臺執行,那麼它呼叫函式 spawn_cron 。

Spawn cron 有兩種可能的操作方法,但是第一種也是最常見的一種是在 wp-cron.php 的 URL 上呼叫 wp_remote_post 函式來連線回到自身。透過做這個額外的 HTTP 請求,它啟動另一個 PHP 程式來做所有的實際工作。這裡提出的請求是 non-blocking,超時時間為 0.01 秒。所以,實際上並沒有得到任何結果。請求的目的只是在後臺啟動一個新的程式。完成之後,它只是返回,所以觀看使用者從來沒有任何延遲。

wp-cron.php 程式是實際工作,更新和其他一切。 WordPress 中的許多程式都由 cron 系統處理。預定的後釋出,處理 ping,更新檢查,可以排程在正常流程之外發生的任何事情,然後以 as-needed 為基礎執行。

但是,對於這個網站來說,一個正常的打擊確實會發生。而不是,WordPress.org 不直接與您的網站聯絡,踢出來,您的網站必須收到某種形式的流量來啟動它。任何形式的交通都會做。

次佳解決方案

實際上,從 wp.org 推送自動更新。更新過程仍然在您的站點上執行,但在後臺透過 wp-cron

當一個新的小更新被釋放時,WordPress 的傢伙開始推出更新。在您的站點檢查 wp.org 進行更新後,實際更新過程將開始,理論上可用更新,您的站點隨機選擇進行更新。


(Thank you @otto for pointing out my wrong wording 🙂 )


由於每個站點都會使用 wp.org 檢查新版本 (通常使用 wp-cron 兩次),所以 rolloutserver 知道有多少站點需要更新。

然後開始緩慢開始,128 個站點中有 1 個自動更新。正在進行監控,如果成功顯示沒有出現問題,更多的網站將獲得自動更新 (通常下一步將是 64 箇中的 1 個,並繼續增加),直到所有的自動更新都被傳遞。

這使開發人員能夠在發生任何問題時停止推出,但是從 3.83.8.1 的最新更新已經獲得了 100%的成功率。

1 out of 128 選擇的站點實際上是隨機的。嗯,不是真的,但如果你想知道,它的工作原理如下:

需要更新的站點的 URL 將使用 MD5 進行雜湊。使用這個雜湊的前三個字元並將其轉換為 base10,這樣可以產生 4096 個可能性。對於計算數為 0 到 31(4096/32 = 128) 的站點,更新開始。

好的,我猜這是非常隨機的;)

在我的情況下,當我執行了很多 WordPress 網站時,更新花了 1 天時間 – 很有趣,看到所有的頁面更新。

以防萬一你在想:D

btw,here 是一篇關於 make.wordpress.org 的文章,描述了這個過程。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。