WordPress Heartbeat API的“节拍”是错开的还是对所有用户同时出现?


14

WordPress Heartbeat API使用admin-ajax.php运行AJAX调用。如果用户X使浏览器保持打开状态,则将对服务器进行许多调用,并且每次调用都在“拍子”发生时发生。现在,如果用户Y保持浏览器打开状态,则将对服务器进行更多调用,并且这些调用中的每一个都会在出现“拍子”时发生。大型网站也可能会同时拥有用户A,用户B和用户C。

我的问题:

考虑到很多用户可能会同时访问网站,WordPress心跳API的“拍子”错开(用户X的“拍子”发生在用户Y的“拍子”之前几秒钟)还是“拍子”发生在完全相同的位置所有用户的时间?

如果“拍子”没有错开,我担心的是在发生“拍子”时服务器上的负载非常重。


我不知道答案,但这很有趣。我想您可以通过从多个浏览器/计算机登录到admin区域来进行基本测试,而不是像本文中提到的那样仔细查看心跳请求和相应的PHP脚本执行。
Nicolai 2014年

@ialocin我几天前激活了一个滴答记录器以进行检查,但是后来我忘记将其关闭,所以当我今天检查出它时,滴答的数量非常吓人;-)
birgire 2014年

我可以想象他们迅速积累。我猜你从答案中得到的例子给出了一个好主意.. @birgire
Nicolai

Answers:


7

我想的节拍是交错的性质,becasue下一个节拍是由浏览器时确定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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.