Jak dokładnie działają automatyczne aktualizacje?

28

Dziś rano otrzymałem wiadomość e-mail z informacją, że moja witryna Wordpress została automatycznie zaktualizowana do najnowszej wersji. Wiedziałem o tej funkcji, ale zawsze zastanawiałem się, jak to działa.

PHP nie jest procesem stale działającym: działa tylko na żądanie. O ile wiem, Wordpress może aktualizować się tylko wtedy, gdy ktoś ładuje stronę internetową. Ale proces aktualizacji nie przebiega natychmiastowo, więc z pewnością użytkownik odwiedzający witrynę miałby bardzo wolne ładowanie strony.

Czy istnieje inna sztuczka, której używają do automatycznych aktualizacji? Szukałem wszędzie, ale nie znalazłem żadnego wyjaśnienia.

DisgruntledGoat
źródło
Dokładniej mówiąc, aktualizacja zostanie przeprowadzona tylko po wydaniu nowej niewielkiej aktualizacji lub aktualizacji zabezpieczeń, na przykład z wersji 3.8 do 3.8.1, ale po wydaniu wersji 3.9 (jako aktualizacji wersji głównej) będziesz musiał to zrobić ręcznie.
Borek

Odpowiedzi:

15

PHP nie jest procesem stale działającym: działa tylko na żądanie. O ile wiem, Wordpress może aktualizować się tylko wtedy, gdy ktoś ładuje stronę internetową. Ale proces aktualizacji nie przebiega natychmiastowo, więc z pewnością użytkownik odwiedzający witrynę miałby bardzo wolne ładowanie strony.

Czy istnieje inna sztuczka, której używają do automatycznych aktualizacji? Szukałem wszędzie, ale nie znalazłem żadnego wyjaśnienia.

System, którego tu szukasz, nazywa się „WP Cron”. Jest to system przetwarzania w tle w WordPressie, który pozwala na występowanie zdarzeń poza normalnym przetwarzaniem. Nadal potrzebują wyzwalacza, aby je uruchomić, ale nie przeszkadzają w ładowaniu stron z powodu procesu w tle.

Tak, ktoś musi załadować twoją stronę. Wyłączony w pliku default-filter.php, znajdziesz następujący wiersz kodu:

add_action( 'init', 'wp_cron' );

Tak więc przy każdym ładowaniu strony działa funkcja wp_cron. Ta funkcja została zakończona w wp-obejmuje / cron.php, a jej zadaniem jest sprawdzenie zaplanowanych zdarzeń w bazie danych. Jeśli są jakieś procesy, które trzeba uruchomić w tle, to wywołuje funkcję spawn_cron.

Spawn cron ma dwie możliwe metody działania, ale pierwszą i najczęstszą jest wywołanie funkcji wp_remote_post w celu nawiązania połączenia z samym sobą, pod adresem URL wp-cron.php. Wykonując to dodatkowe żądanie HTTP, uruchamia inny proces PHP, który wykonuje całą rzeczywistą pracę. Żądanie, które tutaj wysyła, nie jest blokowane, z limitem czasu wynoszącym 0,01 sekundy. Tak więc nie ma tutaj żadnych wyników. Celem tego żądania jest po prostu rozpoczęcie nowego procesu w tle. Po wykonaniu tej czynności po prostu wraca, więc użytkownik oglądający nigdy nie ma żadnych opóźnień.

Proces wp-cron.php jest tym, co faktycznie działa, aktualizację i wszystko inne. Wiele procesów w WordPress jest obsługiwanych przez system cron. Zaplanowane publikowanie po publikacji, przetwarzanie pingów, sprawdzanie aktualizacji, wszystko, co musi się wydarzyć poza normalnym przepływem, można zaplanować, a następnie uruchomić w razie potrzeby.

Ale tak, naprawdę musi się zdarzyć normalny hit na stronie, aby rozpocząć proces. I nie, WordPress.org nie kontaktuje się bezpośrednio z Twoją witryną, aby rozpocząć, Twoja strona musi otrzymać pewien ruch, aby ją uruchomić. Wykona się każda forma ruchu.

Otto
źródło
17

W rzeczywistości wypychana jest automatyczna aktualizacja wp.org. Proces aktualizacji nadal działa w Twojej witrynie, ale w tle za pośrednictwem wp-cron.

Po wydaniu nowej niewielkiej aktualizacji chłopaki z WordPress zaczynają ją aktualizować. Rzeczywisty proces aktualizacji rozpoczyna się po sprawdzeniu wp.orgdostępności witryny , aktualizacja jest teoretycznie dostępna, a witryna jest losowo wybierana do aktualizacji.


(Dziękuję @otto za wskazanie mojego złego sformułowania :))


Ponieważ każda witryna sprawdza wp.orgdostępność nowych wersji (zwykle dwa razy dziennie wp-cron), rolloutserver wie, ile witryn potrzebuje aktualizacji.

Następnie rozpoczyna się wdrażanie, które rozpoczyna się powoli - 1 ze 128 witryn jest aktualizowana automatycznie. Jest to monitorowane, a jeśli sukces nie wskazuje na problemy z wdrożeniem, więcej witryn otrzymuje automatyczną aktualizację (zwykle następnym krokiem będzie 1 na 64 i nadal rośnie w ten sposób), dopóki nie zostaną dostarczone wszystkie automatyczne aktualizacje.

Dzięki temu programiści mogą zatrzymać wdrażanie, jeśli wystąpią jakiekolwiek problemy, ale ostatnia aktualizacja od 3.8do 3.8.1miała 100% skuteczność.

Witryny wybrane przez 1 out of 128są w rzeczywistości losowe. Cóż, niezupełnie, ale jeśli chcesz wiedzieć, działa to tak:

Adres URL witryny wymagającej aktualizacji zostaje zaszyfrowany przy użyciu MD5. Wykorzystanie tylko trzech pierwszych znaków tego skrótu i ​​konwersja do niego base10daje 4096 możliwości. Aktualizacja rozpoczęła się dla witryn mających liczbę obliczoną między 0 a 31 (4096/32 = 128).

Okej, wydaje mi się, że to w końcu dość losowe;)

W moim przypadku, ponieważ prowadzę wiele stron WordPress, aktualizacje zajęły 1 dzień - było całkiem zabawne, gdy wszystkie strony były aktualizowane.

Na wypadek gdybyś się zastanawiał: D

btw, tutaj jest artykuł na make.wordpress.org opisujący proces, jak to się stało.

fischi
źródło
Jeśli jest to „rozpoczęte przez żądanie wp.org do Twojej witryny”, to jak to bezpieczne? Czy ktoś nie może wysłać żądania do Twojej witryny?
DisgruntledGoat
Właściwie to nie wiem, jak to jest obsługiwane technicznie. Ale jestem pewien, że istnieją kontrole bezpieczeństwa, takie jak nonce i / lub skąd pochodzi żądanie.
fischi
1
@fischi Czy otrzymałeś informacje, od których wp.org inicjuje aktualizację? Istnieje DUŻA różnica między wp.org inicjującym aktualizację, a witryną Wordpress sprawdzającą aktualizacje, a następnie inicjującą samą aktualizację, jeśli wp.org powie jej, że są aktualizacje.
kraftner
1
Ta odpowiedź jest w rzeczywistości nieprawidłowa. Proces aktualizacji nie jest inicjowany przez WordPress.org w Twojej witrynie. Twoja strona rzeczywiście potrzebuje pewnego rodzaju ruchu, aby ją uruchomić, ale WordPress.org nie pinguje jej bezpośrednio.
Otto,
1
OK, ale „rozpoczęty przez żądanie wp.org z Twojej witryny” jest niepoprawny. Twoja witryna wysyła żądanie aktualizacji, a odpowiedź informuje, czy jest aktualizacja, czy nie. Nie jest odwrotnie, Twoja witryna musi zainicjować proces.
Otto,
1

Mówiąc bardzo szeroko, gdy użytkownik odwiedza witrynę, wordpress sprawdza, czy upłynął czas wygaśnięcia, a jeśli zostanie wykryte wygaśnięcie, na serwer wysyłane jest kolejne żądanie „uruchomienia” działań związanych z wygasłym zdarzeniem. To dlatego użytkownik nie odczuwa zauważalnego opóźnienia w ładowaniu strony, ponieważ serwer wykonuje rzeczywistą akcję (w tym przypadku aktualizację) w osobnym procesie.

To działa, ale czas nie jest bardzo dokładny. Im większy ruch w witrynie, tym bardziej będzie ona dokładna.

Ludzie, którzy chcą uzyskać lepszą wydajność i dokładniejsze taktowanie, mogą zablokować edytor tekstu „proces” wewnętrznego crona i użyć procesu cron systemu operacyjnego do uruchomienia sprawdzania timerów.

Mark Kaplun
źródło