web-dev-qa-db-ja.com

WordPress Heartbeat APIの「ビート」は互い違いになっていますか、それともすべてのユーザーに対して同時に発生していますか?

WordPress Heartbeat APIはadmin-ajax.phpを使用してAJAX呼び出しを実行します。ユーザーXがブラウザーを開いたままにしておくと、サーバーに多数の呼び出しが行われ、各呼び出しは「ビート」があるときに発生します。ユーザーYが自分のブラウザを開いたままにしておくと、サーバーに対してさらに多くの呼び出しが行われ、これらの呼び出しはそれぞれ 'ビート'が発生したときに発生します。大規模なWebサイトでも、ユーザーA、ユーザーB、およびユーザーCがすべて同じことを行う可能性があります。

私の質問:

多数のユーザーが同時にWebサイトにアクセスする可能性があることを考慮すると、WordPress Heartbeat APIの「ビート」がずれる(ユーザーXの「ビート」がユーザーYの「ビート」の数秒前に発生)すべてのユーザーのための時間?

「ビート」がずれていない場合、私の懸念は「ビート」が発生した時点でサーバーに非常に大きな負荷がかかることです。

14
henrywright

次の tick /wp-includes/js/heartbeat.jsファイル内のtime()メソッド内のブラウザ時間scheduleNextTick()によって決定されるので、ビートは本質的に スタガード であると思います。

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

次のティックをsetTimeout関数でスケジュールするのに使われています。

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

ブラウザ時間は次のように定義されています。

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

connect()メソッドはajax呼び出しを含み、always()を使用します。

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

次の目盛りをスケジュールします。

利用可能な目盛りの間隔は5秒、15秒、30秒、60秒です。

ティック間隔が短い、非常にアクティブなユーザーの数が多い場合は、ビートが同時に発生しているように見える場合があります。

いくつかのデータを持つのは常に良いことです。そのため、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 ); 

これは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