问题描述
WordPress Heartbeat API 使用 admin-ajax.php 来运行 AJAX 调用。如果用户 X 将其浏览器打开,则将对服务器进行许多呼叫,当存在’beat’ 时,每次呼叫都会发生。现在,如果用户 Y 将其浏览器打开,将会向服务器发出更多的呼叫,当有’beat’ 时,每个呼叫都会发生。用户 A,用户 B 和用户 C 的大型网站可能也是一样的。
我的问题:
考虑到许多用户可能同时访问一个网站,WordPress Heartbeat API ‘beats’ 交错 (用户 X 的’beat’ 发生在用户 Y 的’beat’ 前几秒钟),或者’beat’ 是否在所有用户完全相同的时间发生?
如果’beats’ 没有交错,那么当’beat’ 发生时,我的担心是很重的。
最佳解决方案
我会认为节拍是自然交错的,因为下一个刻度是由/wp-includes/js/heartbeat.js
文件中的 scheduleNextTick()
方法中的浏览器时间 time()
确定的:
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
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。