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

13

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, l’API WordPress Heartbeat «décale-t-elle» -elle (le «temps» pour l’utilisateur X se produit quelques secondes avant le «temps» de l’utilisateur Y) ou un «temps» se produit-il à exactement le même 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.

    
posée henrywright 29.08.2014 - 01:07

1 réponse

7

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

 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 temps réduit, 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 heartbeat_tick hook:

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
    
réponse donnée birgire 01.09.2014 - 13:45

Lire d'autres questions sur les étiquettes