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

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

他们是否使用其他技巧来进行自动更新?我搜索了整个地方,但没有找到任何解释。

评论

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

#1 楼


PHP并不是一个永久运行的进程:它只能在请求时运行。但是更新过程不是即时的,因此
当然,访问该网站的用户的页面加载速度会非常慢。我已经在整个地方搜索了,但没有找到任何解释。


您在这里寻找的系统称为“ WP Cron”。这是WordPress中的后台处理系统,允许事件在正常处理之外发生。他们仍然需要触发器来启动它们,但是由于后台进程,它们不会干扰页面加载。

所以,是的,必须有人加载您的页面。在default-filters.php文件中,您将找到以下代码行:

add_action( 'init', 'wp_cron' );

因此,在每次加载页面时,都会运行wp_cron函数。此功能在wp-includes / cron.php中已经结束,它的作用是检查数据库中的预定事件。如果有任何进程需要在后台运行,则调用函数spawn_cron。在wp-cron.php的URL上建立回自身的连接。通过发出此额外的HTTP请求,它将启动另一个PHP进程来完成所有实际工作。它在此处发出的请求是非阻塞的,超时为0.01秒。因此,它实际上在这里没有任何结果。请求的目的仅仅是在后台启动一个新进程。完成此操作后,它只会返回,因此查看用户永远不会有任何延迟。

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

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

#2 楼

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

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



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




当每个站点使用wp.org检查新版本时(通常每天使用wp-cron两次),部署服务器会知道有多少个站点需要更新。

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

这使开发人员可以在出现任何问题时停止推出,但是从3.83.8.1的最新更新的成功率为100%。

1 out of 128实际上是随机的。好吧,不是真的,但是,如果您想知道,它的工作原理如下:仅使用此哈希的前三个字符并将其转换为MD5,将导致4096种可能性。此更新开始于计算出的数字介于0到31之间的网站(4096/32 = 128)。

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

在我的网站上案例,因为我运行了很多WordPress网站,所以更新花了1天的时间-看到所有页面都更新的时候真是太有趣了。 br /> btw,这是make.wordpress.org上的一篇文章,描述了发生的过程。

评论


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

–心怀不满的山羊
2014年1月27日上午11:33

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

– fischi
2014年1月27日,12:02

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

–卡夫纳
2014年8月11日12:11

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

–奥托
2014年11月21日在9:58

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

–奥托
2014年11月21日,12:36

#3 楼

概括地说,当用户访问站点时,WordPress会检查计时器是否到期,如果检测到到期,则会向服务器发送另一个请求,以“运行”与到期事件关联的操作。这就是为什么用户不会感到页面加载有任何明显的延迟的原因,因为服务器是在单独的进程中运行实际操作(在这种情况下为升级)。非常精准。您网站的流量越多,其准确性就越高。

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