Являются ли "удары" WordPress Heartbeat API "ступенчатыми" или они происходят одновременно для всех пользователей?
API сердцебиения WordPress использует admin-ajax.php для выполнения вызовов AJAX. Если пользователь X оставит свой браузер открытым, на сервер будет сделано много вызовов, причем каждый вызов будет происходить при "ударе". Теперь, если пользователь Y оставит свой браузер открытым, на сервер будет сделано гораздо больше вызовов, причем каждый из этих вызовов будет происходить при "ударе". Возможно, на большом веб-сайте также будут пользователи A, B и C, которые делают то же самое.
Мой вопрос:
Учитывая, что многие пользователи могут одновременно заходить на веб-сайт, "удары" WordPress Heartbeat API распределены в шахматном порядке ("удар" для пользователя X происходит за несколько секунд до "удара" для пользователя Y) или "удар" происходит в одно и то же время для всех пользователей?
Если "удары" не расположены в шахматном порядке, меня беспокоит очень большая нагрузка на сервер в тот момент, когда происходит "удар".
1 answers
Я бы подумал, что удары Расположены в шахматном порядке по своей природе, потому что следующий тик определяется временем браузера 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