Чи API "серцебиття" WordPress Heartbeat є поетапним чи вони відбуваються одночасно для всіх користувачів?


14

API WordPress Heartbeat використовує адмін-ajax.php для запуску дзвінків AJAX. Якщо користувач X залишає свій браузер відкритим, на сервер буде здійснюватися багато дзвінків, при цьому кожен виклик відбувається, коли відбувається "ритм". Тепер, якщо користувач Y залишить свій браузер відкритим, на сервер буде здійснено набагато більше дзвінків, причому кожен з цих дзвінків відбувається, коли відбувається "ритм". Можливо, на великому веб-сайті також будуть користувачі A, користувач B та користувач C, які роблять те саме.

Моє запитання:

Зважаючи на те, що багато користувачів можуть одночасно отримувати доступ до веб-сайту, чи API WordPress Heartbeat "б'є" поетапно ("ритм" для користувача X відбувається за кілька секунд до того, як "бити" для користувача Y), або "бит" відбувається точно так само час для всіх користувачів?

Якщо "удари" не є поетапними, моє занепокоєння викликає дуже велике навантаження на сервер у момент, коли відбувається "биття".


Я не знаю відповіді на це, хоча це цікаво. Я думаю, ви могли б зробити базовий тест, увійшовши в адміністраторську область з декількох браузерів / комп’ютерів і, ніж детальніше ознайомитись із запитами серцебиття та виконанням сценаріїв PHP, дещо так, як згадується в цій статті .
Миколай

@ialocin я активував реєстратор кліщів кілька днів тому, щоб перевірити це, але потім забув вимкнути його, тому коли я перевірив його сьогодні, кількість кліщів була досить страшною ;-)
birgire

Я можу собі уявити, що вони накопичуються швидко. Приклад з вашої відповіді дає хорошу думку, я здогадуюсь. @Birgire
Ніколай,

Відповіді:


7

Я думаю, що удари мають пошаговий характер, оскільки наступна галочка визначається часом браузера 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();
})

запланувати наступну галочку.

Доступні інтервали галочок - 5s, 15s, 30s та 60s.

Для великої кількості дуже активних користувачів, з коротким інтервалом галочки, удари можуть здаватися одночасно.

Завжди добре мати деякі дані, щоб ви могли зафіксувати галочки з зареєстрованих користувачів за допомогою 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

Дякую за таку детальну відповідь. Моє розуміння - це два удари за цикл. Початковий такт, який визначається браузером, а потім зворотний . З вашої відповіді видно, що початковий удар є поетапним. Чи є поетапний зворотний ритм (який надсилає дані з сервера назад до браузера)?
henrywright
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.