問題描述
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。