web-dev-qa-db-fra.com

Les "battements" de l'API WordPress Heartbeat sont-ils échelonnés ou surviennent-ils simultanément pour tous les utilisateurs?

L'API WordPress Heartbeat utilise admin-ajax.php pour exécuter les appels AJAX. Si l'utilisateur X laisse son navigateur ouvert, de nombreux appels seront passés au serveur, chaque appel ayant lieu lorsqu'il y a un "battement". Désormais, si l'utilisateur Y laisse son navigateur ouvert, le serveur reçoit beaucoup plus d'appels. Chacun de ces appels se produit lorsqu'il y a un "battement". Il est possible qu'un grand site Web fasse également en sorte que l'utilisateur A, l'utilisateur B et l'utilisateur C fassent de même.

Ma question:

Si de nombreux utilisateurs peuvent accéder simultanément à un site Web, les API de WordPress Heartbeat sont-elles décalées (le "temps" pour l'utilisateur X survient quelques secondes avant le "temps" pour l'utilisateur Y) ou un "temps" se produit-il exactement de la même manière? temps pour tous les utilisateurs?

Si les "temps" ne sont pas décalés, je crains une charge très lourde pour le serveur au moment où un "temps" se produit.

14
henrywright

Je pense que les battements sont Décalés par nature, car le prochain tick est déterminé par la durée du navigateur time() dans la méthode scheduleNextTick() dans le fichier /wp-includes/js/heartbeat.js:

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

où il est utilisé pour planifier le prochain tick avec la fonction setTimeout:

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

L'heure du navigateur est définie comme suit:

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

La méthode connect() contient l'appel ajax et utilise always()

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

pour programmer le prochain tick.

Les intervalles de ticks disponibles sont 5, 15, 30 et 60.

Pour un grand nombre d'utilisateurs très actifs, avec un intervalle de ticks court, les battements peuvent sembler se produire simultanément.

Il est toujours bon de disposer de certaines données. Vous pouvez donc enregistrer les ticks des utilisateurs connectés avec le hook heartbeat_tick:

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

Voici un exemple tiré du fichier ticks.log:

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
7
birgire