Le battute dell'API Heartbeat di WordPress sono sfalsate o si verificano contemporaneamente per tutti gli utenti?


14

L'API Heartbeat di WordPress utilizza admin-ajax.php per eseguire chiamate AJAX. Se l'utente X lascia il browser aperto, molte chiamate verranno effettuate al server, con ogni chiamata che si verifica quando c'è un "battito". Ora, se l'utente Y lascia aperto il browser, molte più chiamate verranno effettuate al server, con ognuna di queste chiamate quando si verifica un "battito". È possibile che un sito Web di grandi dimensioni includa anche l'utente A, l'utente B e l'utente C.

La mia domanda:

Considerando che molti utenti potrebbero accedere contemporaneamente a un sito Web, l'API Heartbeat di WordPress "batte" sfalsata (il "battito" per l'utente X si verifica pochi secondi prima del "battito" per l'utente Y) o si verifica un "battito" esattamente allo stesso tempo per tutti gli utenti?

Se i "battiti" non sono scaglionati, la mia preoccupazione è un carico molto pesante sul server nel momento in cui si verifica un "battito".


Non conosco la risposta a questa domanda, è comunque interessante. Immagino che potresti fare un test di base accedendo all'area di amministrazione da più browser / computer e osservando più da vicino le richieste del battito cardiaco e le esecuzioni degli script PHP corrispondenti, un po 'come menzionato in questo articolo .
Nicolai,

@ialocin Alcuni giorni fa ho attivato un registratore di tick per verificarlo, ma poi ho dimenticato di spegnerlo, quindi quando l'ho verificato oggi, la quantità di tick era abbastanza spaventosa ;-)
birgire

Posso immaginare che si accumulino rapidamente. L'esempio della tua risposta dà una buona idea, immagino .. @birgire
Nicolai,

Risposte:


7

Penso che i battiti siano sfalsati per natura, poiché il segno di spunta successivo è determinato dal tempo del browser time()all'interno del scheduleNextTick()metodo nel /wp-includes/js/heartbeat.jsfile:

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

dove è usato per programmare il prossimo tick con la setTimeoutfunzione:

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

Il tempo del browser è definito come:

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

Il connect()metodo contiene la chiamata ajax e utilizzaalways()

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

per programmare il prossimo tick.

Gli intervalli di tick disponibili sono 5, 15, 30 e 60.

Per un gran numero di utenti molto attivi, con un breve intervallo di tick, i battiti potrebbero sembrare accadere contemporaneamente.

È sempre utile disporre di alcuni dati, quindi è possibile registrare i tick dagli utenti che hanno effettuato l'accesso, con l' heartbeat_tickhook:

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 ); 

Ecco un esempio dal ticks.logfile:

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

Grazie per una risposta così dettagliata. La mia comprensione è che ci sono due battute in un ciclo. Il battito iniziale che è determinato dal browser e quindi un battito di ritorno . È chiaro dalla tua risposta che il battito iniziale è scaglionato. Anche il beat di ritorno (che rimanda i dati dal server al browser) è scaglionato?
henrywright,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.