自动更新如何工作?


28

我今天早上收到一封电子邮件,指出我的Wordpress网站已自动更新为最新版本。我知道此功能,但我一直想知道它的工作原理。

PHP不是一个永久运行的进程:它仅在请求时运行。据我所知,Wordpress只能在有人加载网页时进行自我更新。但是更新过程不是即时的,因此,访问该网站的用户肯定会加载非常缓慢的页面。

他们用于自动更新的技巧是否不同?我到处搜寻,但未找到任何解释。


准确地说,它仅在发布新的次要或安全更新时才更新,例如从3.8升级到3.8.1,但是在发布3.9(作为主要版本更新)时,您将必须手动进行。
Borek 2014年

Answers:


15

PHP不是一个永久运行的进程:它仅在请求时运行。据我所知,Wordpress只能在有人加载网页时进行自我更新。但是更新过程不是即时的,因此,访问该网站的用户肯定会加载非常缓慢的页面。

他们用于自动更新的技巧是否不同?我到处搜寻,但未找到任何解释。

您在这里寻找的系统称为“ 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进程来完成所有实际工作。它在此处发出的请求是非阻塞的,超时为0.01秒。因此,它实际上在这里没有任何结果。请求的目的仅仅是在后台启动一个新进程。完成此操作后,它只会返回,因此查看用户永远不会有任何延迟。

wp-cron.php进程是实际工作,更新和其他所有工作。WordPress中的许多流程都由cron系统处理。可以计划排定的发布,处理ping,更新检查,以及在正常流程之外需要进行的任何事情,然后根据需要运行。

但是,是的,确实必须对站点进行正常的攻击才能启动该过程。而且,WordPress.org不会直接与您的网站联系以启动事情,您的网站必须收到某种形式的流量才能启动。任何形式的流量都可以。


17

实际上,自动更新是从推送的wp.org。更新过程仍在您的网站上运行,但通过在后台进行wp-cron

当新的次要更新发布时,WordPress的家伙开始推出该更新。实际的更新过程在您的站点检查wp.org更新之后开始,理论上有可用的更新,并且您的站点是随机选择进行更新的。


(感谢@otto指出我的错误措辞:))


当每个站点都在检查是否有wp.org新版本(通常每天使用两次wp-cron)时,rolloutserver会知道有多少站点需要更新。

然后开始缓慢地开始部署-128个站点中的1个会自动更新。这是受监视的,如果成功表明部署没有问题,则更多站点将获得自动更新(通常,下一步将是64个站点中的1个,并以这种方式继续增加),直到所有自动更新都交付为止。

这使开发人员可以在出现任何问题时停止推出产品,但是从3.8到的最后一次更新3.8.1成功率为100%。

所选择的网站1 out of 128实际上是随机的。好吧,不是真的,但是如果您想知道,它的工作方式如下:

需要更新的网站网址使用进行哈希处理MD5。仅使用此哈希的前三个字符并将其转换为base10,就可以得到4096种可能性。已更新站点的计算数量在0到31之间(4096/32 = 128)。

好的,我想这毕竟是很随机的;)

以我为例,当我运行许多WordPress网站时,更新花费了1天的时间-很高兴看到所有页面何时更新。

万一你想知道:D

顺便说一句,是make.wordpress.org上的一篇文章,描述了发生的过程。


如果它是“从wp.org向您的网站发出的请求开始的”,那么它的安全性如何?没人可以向您的网站发送请求吗?
DisgruntledGoat 2014年

实际上,我不知道该如何处理。但是我确信会有安全检查,例如随机数和/或请求来自何处。
fischi 2014年

1
@fischi您是否获得了wp.org发起更新的信息?如果wp.org告知更新存在,则wp.org启动更新或wordpress网站检查更新,然后自行启动更新之间存在很大的区别。
kraftner 2014年

1
这个答案实际上是不正确的。WordPress.org不会启动更新过程到您的站点。您的网站确实确实需要某种形式的流量来启动它,但是WordPress.org不会直接对您的网站执行ping操作。
奥托2014年

1
可以,但是“由wp.org向您的网站发出的请求开始”是不正确的。您的站点发出更新请求,并且响应告诉您是否有更新。并非相反,您的站点必须启动该过程。
奥托2014年

1

广义上讲,当用户访问站点时,WordPress会检查计时器是否到期,如果检测到到期,则会向服务器发送另一个请求,以“运行”与到期事件关联的操作。这就是为什么用户不会感到页面加载有任何明显的延迟的原因,因为服务器在单独的进程中运行实际操作(在这种情况下为升级)。

这行得通,但时间安排不是很准确。您网站的流量越多,其准确性就越高。

想要获得更好的性能和更准确的计时的人可以阻止内部cron“进程” wordpress拥有,并使用OS cron进程来触发计时器检查。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.