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


14

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

私の質問:

多くのユーザーが同時にウェブサイトにアクセスする可能性、WordPress Heartbeat APIの「ビート」がずらされている(ユーザーXの「ビート」はユーザーYの「ビート」の数秒前に発生する)、または「ビート」がまったく同じに発生するすべてのユーザーの時間ですか?

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


これに対する答えはわかりませんが、興味深いです。複数のブラウザー/コンピューターから管理領域にログインし、ハートビートリクエストとそれに対応するPHPスクリプトの実行を詳しく調べるよりも、この記事で説明したように、基本的なテストができると思います。
ニコライ14

@ialocinこれをチェックするために数日前にティックロガーをアクティブにしましたが、それをオフにするのを忘れたため、今日チェックアウトしたときにティックの量は非常に怖かったです
;

彼らはすぐに蓄積すると想像できます。あなたからの例の答えは、私が推測する良いアイデアを与える.. @birgire
ニコライ

回答:


7

私はビートがあると思うだろう千鳥次becasue、自然にダニがブラウザの時間によって決定されたtime()範囲内 scheduleNextTick()でメソッド/wp-includes/js/heartbeat.jsファイル:

 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

このような詳細な回答をありがとう。私の理解では、サイクルには2つのビートがあります。ブラウザによって決定された最初のビートとリターンビート。あなたの答えから、最初のビートがずらされていることは明らかです。リターンビート(データをサーバーからブラウザーに送り返す)もずらされていますか?
ヘンリーライト14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.