Apakah WordPress Heartbeat API 'berdetak' mengejutkan atau terjadi secara bersamaan untuk semua pengguna?

14

WordPress Heartbeat API menggunakan admin-ajax.php untuk menjalankan panggilan AJAX. Jika Pengguna X membiarkan browser mereka terbuka, banyak panggilan akan dilakukan ke server, dengan setiap panggilan terjadi ketika ada 'ketukan'. Sekarang jika Pengguna Y membiarkan browser mereka terbuka, lebih banyak panggilan akan dilakukan ke server, dengan masing-masing panggilan ini terjadi ketika ada 'ketukan'. Mungkin situs web besar juga akan memiliki Pengguna A, Pengguna B dan Pengguna C semua melakukan hal yang sama.

Pertanyaan saya:

Mengingat banyak pengguna dapat mengakses situs web secara bersamaan, apakah WordPress Heartbeat API 'beats' ('beat' untuk Pengguna X terjadi beberapa detik sebelum 'beat' untuk Pengguna Y) atau apakah 'beat' terjadi persis sama waktu untuk semua pengguna?

Jika 'beat' tidak terhuyung-huyung, kekhawatiran saya adalah beban yang sangat berat di server pada saat 'beat' terjadi.

Henryrywright
sumber
Saya tidak tahu jawabannya, ini menarik. Saya membayangkan Anda bisa melakukan tes dasar dengan masuk ke area admin dari beberapa browser / komputer dan daripada melihat lebih dekat pada permintaan detak jantung dan eksekusi skrip PHP yang sesuai, agak seperti disebutkan dalam artikel ini .
Nicolai
@ialocin Saya mengaktifkan tick logger beberapa hari yang lalu untuk memeriksanya, tetapi saya kemudian lupa mematikannya sehingga ketika saya memeriksanya hari ini, jumlah ticks cukup menakutkan ;-)
birgire
Saya bisa membayangkan bahwa mereka menumpuk dengan cepat. Contoh dari jawaban Anda memberikan ide yang bagus, kurasa .. @Birgire
Nicolai

Jawaban:

7

Saya akan berpikir bahwa ketukan itu terhuyung - huyung oleh alam, karena centang selanjutnya ditentukan oleh waktu browser time()dalam scheduleNextTick()metode dalam /wp-includes/js/heartbeat.jsfile:

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

di mana ia digunakan untuk menjadwalkan centang berikutnya dengan setTimeoutfungsi:

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

Waktu browser didefinisikan sebagai:

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

The connect()metode berisi panggilan ajax dan penggunaanalways()

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

untuk menjadwalkan centang berikutnya.

Interval centang yang tersedia adalah 5s, 15s, 30s, dan 60s.

Untuk sejumlah besar pengguna yang sangat aktif, dengan interval centang pendek, ketukan mungkin tampak terjadi secara bersamaan.

Itu selalu baik untuk memiliki beberapa data, sehingga Anda bisa mencatat kutu dari pengguna yang masuk, dengan heartbeat_tickkait:

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

Berikut ini contoh dari ticks.logfile tersebut:

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
sumber
Terima kasih atas jawaban terinci seperti itu. Pemahaman saya adalah ada dua ketukan dalam satu siklus. Beat awal yang ditentukan oleh browser dan kemudian beat kembali . Jelas dari jawaban Anda bahwa ketukan awal terhuyung. Apakah beat kembali (yang mengirim data dari server kembali ke browser) terhuyung-huyung juga?
henrywright