¿Los 'latidos' API de WordPress Heartbeat son escalonados o ocurren simultáneamente para todos los usuarios?

14

La API Heartbeat de WordPress usa admin-ajax.php para ejecutar llamadas AJAX. Si el usuario X deja abierto su navegador, se realizarán muchas llamadas al servidor, y cada llamada se realizará cuando haya un "latido". Ahora, si el usuario Y deja abierto su navegador, se realizarán muchas más llamadas al servidor, y cada una de estas llamadas sucederá cuando haya un 'latido'. Es posible que un sitio web grande también haga que el Usuario A, el Usuario B y el Usuario C hagan lo mismo.

Mi pregunta:

Teniendo en cuenta que muchos usuarios pueden acceder a un sitio web simultáneamente, ¿los 'latidos' de WordPress Heartbeat API son escalonados (el 'latido' para el usuario X ocurre unos segundos antes del 'latido' para el usuario Y) o se produce un 'latido' exactamente igual? tiempo para todos los usuarios?

Si los 'latidos' no se escalonan, mi preocupación es una carga muy pesada en el servidor en el momento en que ocurre un 'latido'.

henrywright
fuente
No sé la respuesta a esto, aunque es interesante. Me imagino que podría hacer una prueba básica iniciando sesión en el área de administración desde múltiples navegadores / computadoras y luego mirando más de cerca las solicitudes de latido y las ejecuciones de script PHP correspondientes, algo como se menciona en este artículo .
Nicolai
@ialocin Activé un registrador de garrapatas hace unos días para verificar esto, pero luego olvidé apagarlo, así que cuando lo revisé hoy, la cantidad de garrapatas
daba
Me imagino que se acumulan rápidamente. El ejemplo de su respuesta da una buena idea, supongo .. @birgire
Nicolai

Respuestas:

7

Creo que los ritmos son escalonados por naturaleza, porque el siguiente tic está determinado por el tiempo del navegador time()dentro del scheduleNextTick()método en el /wp-includes/js/heartbeat.jsarchivo:

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

donde se usa para programar el próximo tic con la setTimeoutfunción:

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

El tiempo del navegador se define como:

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

El connect()método contiene la llamada ajax y utilizaalways()

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

para programar el próximo tic.

Los intervalos de tick disponibles son 5s, 15s, 30s y 60s.

Para un gran número de usuarios muy activos, con un breve intervalo de tics, los ritmos pueden parecer simultáneos.

Siempre es bueno tener algunos datos, por lo que puede registrar los ticks de los usuarios conectados, con el heartbeat_tickenlace:

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

Aquí hay un ejemplo del ticks.logarchivo:

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
fuente
Gracias por una respuesta tan detallada. Entiendo que hay dos latidos por ciclo. El tiempo inicial que determina el navegador y luego un tiempo de retorno . Está claro por su respuesta que el ritmo inicial es escalonado. ¿El ritmo de retorno (que envía los datos del servidor de regreso al navegador) también es escalonado?
henrywright