As 'batidas' da API de pulsação do WordPress são escalonadas ou ocorrem simultaneamente para todos os usuários?

14

A API de pulsação do WordPress usa admin-ajax.php para executar chamadas AJAX. Se o Usuário X deixar o navegador aberto, muitas chamadas serão feitas para o servidor, sendo que cada uma delas ocorrerá quando houver uma "batida". Agora, se o Usuário Y deixar o navegador aberto, muitas outras chamadas serão feitas para o servidor, sendo que cada uma dessas chamadas ocorrerá quando houver uma "batida". É possível que um site grande também tenha o Usuário A, o Usuário B e o Usuário C, todos fazendo o mesmo.

Minha pergunta:

Considerando que muitos usuários podem acessar um site simultaneamente, os batimentos da API de pulsação do WordPress são escalonados (a batida do usuário X ocorre alguns segundos antes da batida do usuário Y) ou ocorre uma batida exatamente da mesma maneira tempo para todos os usuários?

Se as 'batidas' não forem escalonadas, minha preocupação é uma carga muito pesada no servidor no momento em que ocorre uma 'batida'.

Henry Wright
fonte
Eu não sei a resposta para isso, é interessante. Eu imagino que você poderia fazer um teste básico efetuando login na área de administração a partir de vários navegadores / computadores e, em seguida, examinando com mais atenção as solicitações de pulsação e as execuções de script PHP correspondentes, como mencionado neste artigo .
Nicolai
@ialocin eu ativei um logger carrapato há alguns dias para verificar isso, mas eu, em seguida, esqueceu de desligá-lo por isso, quando eu verifiquei hoje, a quantidade de carrapatos foi bastante assustador ;-)
birgire
Eu posso imaginar que eles se acumulam rapidamente. O exemplo de você resposta dá uma boa idéia eu acho .. @birgire
Nicolai

Respostas:

7

Eu acho que as batidas são escalonadas por natureza, porque o próximo tick é determinado pelo tempo do navegador time()dentro do scheduleNextTick()método no /wp-includes/js/heartbeat.jsarquivo:

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

onde é usado para agendar o próximo tick com a setTimeoutfunção:

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

O horário do navegador é definido como:

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

O connect()método contém a chamada ajax e usaalways()

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

para agendar o próximo tick.

Os intervalos de escala disponíveis são 5s, 15s, 30s e 60s.

Para um grande número de usuários muito ativos, com um intervalo curto de tique, as batidas podem parecer acontecer simultaneamente.

É sempre bom ter alguns dados, para que você possa registrar os ticks dos usuários logados, com o heartbeat_tickgancho:

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

Aqui está um exemplo do ticks.logarquivo:

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
fonte
Obrigado por uma resposta tão detalhada. Meu entendimento é que existem duas batidas em um ciclo. A batida inicial que é determinada pelo navegador e depois uma batida de retorno . Está claro em sua resposta que a batida inicial é escalonada. A batida de retorno (que envia dados do servidor de volta para o navegador) também é desconcertada?
henrywright 02/09