Sind die "Beats" der WordPress Heartbeat-API gestaffelt oder treten sie für alle Benutzer gleichzeitig auf?

14

Die WordPress Heartbeat API verwendet admin-ajax.php, um AJAX-Aufrufe auszuführen. Wenn Benutzer X seinen Browser offen lässt, werden viele Anrufe an den Server getätigt, wobei jeder Anruf bei einem "Beat" erfolgt. Wenn Benutzer Y seinen Browser offen lässt, werden viel mehr Anrufe an den Server getätigt, wobei jeder dieser Anrufe bei einem "Beat" erfolgt. Es ist möglich, dass auf einer großen Website Benutzer A, Benutzer B und Benutzer C dasselbe tun.

Meine Frage:

Bedenkt man, dass viele Benutzer möglicherweise gleichzeitig auf eine Website zugreifen, werden die "Beats" der WordPress Heartbeat-API gestaffelt (der "Beat" für Benutzer X tritt einige Sekunden vor dem "Beat" für Benutzer Y auf) oder tritt ein "Beat" genau zur gleichen Zeit auf Zeit für alle Benutzer?

Wenn die Beats nicht gestaffelt sind, ist meine Sorge, dass der Server an dem Punkt, an dem ein Beat auftritt, sehr stark belastet wird.

Henrywright
quelle
Ich kenne die Antwort darauf nicht, aber es ist interessant. Ich stelle mir vor, Sie könnten einen grundlegenden Test durchführen, indem Sie sich von mehreren Browsern / Computern aus in den Admin-Bereich einloggen und dann die Heartbeat-Anfragen und die entsprechenden PHP-Skriptausführungen etwas genauer betrachten, wie in diesem Artikel erwähnt .
Nicolai
@ialocin Ich habe vor ein paar Tagen einen Zeckenlogger aktiviert, um dies zu überprüfen, aber dann habe ich vergessen, ihn auszuschalten. Als ich ihn heute
auscheckte
Ich kann mir vorstellen, dass sie sich schnell ansammeln. Das Beispiel von Ihnen Antwort gibt eine gute Idee, denke ich .. @ Birgire
Nicolai

Antworten:

7

Ich würde denken, dass die Beats von Natur aus gestaffelt sind , da der nächste Tick durch die Browserzeit time()innerhalb der scheduleNextTick()Methode in der /wp-includes/js/heartbeat.jsDatei bestimmt wird:

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

wo es verwendet wird, um den nächsten Tick mit der setTimeoutFunktion zu planen :

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

Die Browserzeit ist definiert als:

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

Die connect()Methode enthält den Ajax-Aufruf und verwendetalways()

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

um den nächsten Tick zu planen.

Die verfügbaren Tick-Intervalle sind 5s, 15s, 30s und 60s.

Bei einer großen Anzahl sehr aktiver Benutzer mit einem kurzen Tick-Intervall scheinen die Beats möglicherweise gleichzeitig zu erfolgen.

Es ist immer gut, einige Daten zu haben, damit Sie die Ticks der angemeldeten Benutzer mit dem heartbeat_tickHaken protokollieren können :

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

Hier ist ein Beispiel aus der ticks.logDatei:

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
quelle
Vielen Dank für eine so ausführliche Antwort. Ich verstehe , dass ein Zyklus aus zwei Takten besteht. Der anfängliche Schlag, der vom Browser bestimmt wird, und dann ein Rückschlag . Aus Ihrer Antwort geht klar hervor, dass der anfängliche Schlag gestaffelt ist. Ist der Return-Beat (der Daten vom Server zurück an den Browser sendet) auch gestaffelt?
Henrywright