問題描述
我今天早上收到一封電子郵件,指出我的 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.8 到 3.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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。