Czy WordPress Heartbeat API „bije” naprzemiennie, czy występują one jednocześnie dla wszystkich użytkowników?

14

Interfejs API WordPress Heartbeat używa admin-ajax.php do uruchamiania wywołań AJAX. Jeśli użytkownik X pozostawi otwartą przeglądarkę, wiele połączeń zostanie nawiązanych na serwer, a każde połączenie będzie miało miejsce, gdy nastąpi „bicie”. Teraz, jeśli użytkownik Y pozostawi otwartą przeglądarkę, do serwera zostanie nawiązanych znacznie więcej połączeń, a każde z nich będzie miało miejsce w przypadku „bicia”. Możliwe, że w dużej witrynie będą również znajdować się użytkownicy A, B i C.

Moje pytanie:

Biorąc pod uwagę, że wielu użytkowników może jednocześnie uzyskiwać dostęp do witryny, czy WordPress Heartbeat API „bije” rozłożone w czasie („bicie” dla użytkownika X następuje kilka sekund przed „bicie” dla użytkownika Y) lub „bicie” występuje dokładnie w tym samym czas dla wszystkich użytkowników?

Jeśli „beaty” nie są rozłożone, moim zmartwieniem jest bardzo duże obciążenie serwera w momencie, w którym występuje „beat”.

henrywright
źródło
Nie znam odpowiedzi na to pytanie, jest to jednak interesujące. Wyobrażam sobie, że mógłbyś wykonać podstawowy test, logując się do obszaru administracyjnego z wielu przeglądarek / komputerów i nie przyglądając się bliżej żądaniom pulsu i odpowiednim wykonaniom skryptów PHP, nieco jak wspomniano w tym artykule .
Nicolai
@ialocin Aktywowałem rejestrator kleszczy kilka dni temu, aby to sprawdzić, ale potem zapomniałem go wyłączyć, więc kiedy to sprawdziłem dzisiaj, ilość kleszczy była dość przerażająca ;-)
birgire
Mogę sobie wyobrazić, że kumulują się szybko. Przykład z twojej odpowiedzi daje dobry pomysł, jak sądzę .. @irgire
Nicolai

Odpowiedzi:

7

Myślę, że rytmy są rozłożone w przyrodzie, ponieważ następny tik zależy od czasu przeglądarki time()w scheduleNextTick()metodzie w /wp-includes/js/heartbeat.jspliku:

 var delta = time() - settings.lastTick,
     interval = settings.mainInterval;

gdzie służy do planowania następnego tiku za pomocą setTimeoutfunkcji:

if ( delta < interval ) {
    settings.beatTimer = window.setTimeout(
        function() {
            connect();
        },
        interval - delta
     );
} else {
    connect();
}

Czas przeglądarki definiuje się jako:

function time() {
   return (new Date()).getTime();
}

connect()Metoda zawiera wywołanie ajax i wykorzystujealways()

.always( function() {
    settings.connecting = false;
    scheduleNextTick();
})

aby zaplanować następny tik.

Dostępne interwały tyknięcia to 5s, 15s, 30s i 60s.

W przypadku dużej liczby bardzo aktywnych użytkowników, z krótkim odstępem czasu między tikami, rytmy mogą wydawać się występować jednocześnie.

Zawsze dobrze jest mieć jakieś dane, abyś mógł rejestrować tiki od zalogowanych użytkowników za pomocą heartbeat_tick haka:

add_action( 'heartbeat_tick', 
    function(  $response, $screen_id  )
    {
        $file =  WP_CONTENT_DIR . '/ticks.log'; // Edit this filepath to your needs.

        if( file_exists( $file ) && is_writeable( $file ) ) 
        {
            file_put_contents( 
                $file, 
                sprintf( "%s - Tick from user_id : %d - from screen_id : %s" . PHP_EOL,
                    date( 'c' ),
                    get_current_user_id(),
                    $screen_id
                ), 
                FILE_APPEND | LOCK_EX 
            );
        }
    }
, 11, 2 ); 

Oto przykład z ticks.logpliku:

2014-09-01T12:41:04+00:00 - Tick from user_id : 1 - from screen_id : edit-post
2014-09-01T12:41:19+00:00 - Tick from user_id : 1 - from screen_id : edit-post
2014-09-01T12:41:34+00:00 - Tick from user_id : 1 - from screen_id : edit-post
2014-09-01T12:41:56+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:42:11+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:42:20+00:00 - Tick from user_id : 3 - from screen_id : upload
2014-09-01T12:42:38+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:43:05+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:43:08+00:00 - Tick from user_id : 3 - from screen_id : attachment
2014-09-01T12:43:20+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:43:36+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:44:17+00:00 - Tick from user_id : 3 - from screen_id : profile
birgire
źródło
Dzięki za tak szczegółową odpowiedź. Rozumiem, że cykl ma dwa uderzenia. Początkowe uderzenie, które określa przeglądarka, a następnie uderzenie zwrotne . Z twojej odpowiedzi jasno wynika, że ​​początkowy beat jest rozłożony. Czy rytm powrotu (który wysyła dane z serwera z powrotem do przeglądarki) również jest rozłożony?
henrywright