问题描述

我今天早上收到一封电子邮件,指出我的 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。