«Удары» API Wordbeat Heartbeat в шахматном порядке или они происходят одновременно для всех пользователей?

14

API WordPress Heartbeat использует admin-ajax.php для выполнения вызовов AJAX. Если пользователь X оставит свой браузер открытым, на сервер будет сделано много звонков, причем каждый звонок происходит, когда происходит «удар». Теперь, если пользователь Y оставит свой браузер открытым, серверу будет сделано гораздо больше звонков, и каждый из этих звонков будет происходить, когда есть «удар». Вполне возможно, что на большом веб-сайте также будут присутствовать пользователь A, пользователь B и пользователь C.

Мой вопрос:

Учитывая, что многие пользователи могут одновременно получать доступ к веб-сайту, расположены ли «удары» API WordPress Heartbeat («удар» для пользователя X происходит за несколько секунд до «удара» для пользователя Y) или «удар» происходит точно так же время для всех пользователей?

Если «удары» не находятся в шахматном порядке, меня беспокоит очень большая нагрузка на сервер в тот момент, когда происходит «удары».

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

запланировать следующий тик.

Доступны интервалы между тиками: 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
birgire
источник
Спасибо за такой подробный ответ. Я понимаю, что есть два удара в цикле. Начальный удар, который определяется браузером, а затем возвратный удар . Из вашего ответа ясно, что начальный ритм поражен. Возвратный ритм (который отправляет данные с сервера обратно в браузер) также в шахматном порядке?
Генрирайт