Heartbeat API long polling

时间:2014-09-22 作者:user3562259

我最近注意到,在Heartbeat API js客户端中,添加了一个选项,称为“长轮询”,间隔为0。我非常理解他们试图实现什么,但我对如何使用此功能实现插件感到困惑。

现在,每当我的服务器收到来自浏览器的请求时,就会触发钩子,查询数据,创建响应并发送回客户端。但如果间隔为0,我实际上应该在挂钩中等待某个事件被触发,然后创建响应,对吗?

有人能提供一些简单的代码作为这个新特性的示例吗?

1 个回复
SO网友:Stephen Harris

Hearbeat API的工作原理是定期向服务器发送XHR请求,并为WordPress/插件/主题提供挂钩,以附加要返回给客户端的数据。一旦返回数据,就会安排一个新的节拍。心跳的速度(或“脉冲”)可以在服务器端或客户端对事件(例如用户不活动)的反应中进行调节。

长轮询的工作方式类似,但(来源:Wikipedia)

如果在收到轮询时,服务器没有任何可供客户端使用的信息,则服务器将保持请求打开,并等待响应信息变为可用,而不是发送空响应。一旦完成,服务器立即向客户端发送HTTP/S响应,完成打开HTTP/S请求。

因此,我们发送一个请求,服务器在数据准备就绪时将其发送回,而不是定期发送请求并希望我们得到一些反馈。一旦发生,我们immediately 启动新的XHR请求,因此间隔为0。

健康警告

如问题评论中所述,长轮询是WordPress中的“潜在”功能。Heartbeat API对其进行了规定,而没有实际实现它。未实施的原因包括track ticket #23216, 我建议你阅读讨论。

但简而言之,缺点/潜在问题包括:

  • Caching - 长轮询请求加载WordPress。缓存数据库查询(包括选项、帖子等)。如果脚本正在等待更改数据,则需要注意不要检查缓存数据,除非清除缓存,否则缓存数据不会更改
  • Server settings - 在此上下文中,长轮询请求可以被视为(可能)非常长的页面请求。下面的示例在20秒后自杀,但您的主机可能早在20秒前就自杀了,这使得长时间轮询变得相当无能
  • Server resources - 每个访问者都会占用服务器资源,几乎总是这样
出于这些原因,我建议您仅在受控环境中使用它(例如,您控制服务器,以及哪些插件/主题正在运行)。但有了这种级别的控制,您可能需要考虑改用WebSocket。

设置长轮询1。设置间隔

首先需要将间隔设置为“长轮询”。实际上,这意味着间隔为0。

function wpse162220_heartbeat_settings( $settings ) {
    $settings[\'interval\'] = \'long-polling\';
    return $settings;
}
add_filter( \'heartbeat_settings\', \'wpse162220_heartbeat_settings\' );

2。添加“长轮询侦听器”(long poll listener)

这是一个回调,允许您附加要返回到客户端的数据。复制Nacin的例子,我们有一个2秒的周期,最多等待20秒。

function wpse162220_poll() {

    for ( $i = 0; $i < 10; $i++ ) {

        $val = apply_filters( \'wpse162220_poll\', array() );

        if ( ! empty($val) ) {
            echo json_encode($val);
            exit;
        }

        sleep(2);
    }

    echo \'0\';
    exit;
}

add_action( \'heartbeat_tick\', \'wpse162220_poll\' );
add_action( \'heartbeat_nopriv_tick\', \'wpse162220_poll\' ); 

3。(a) 附加数据

这是一个“虚拟”函数,只需等待上一节中循环的第三次迭代,然后添加一些数据

function wpse162220_populate_data( $value ){
    static $counter = 0;

    $counter++;

    if( $counter == 3 ){
        $value[\'wpse162220\'] = \'foobar\';
    }

    return $value;

}
add_filter( \'wpse162220_poll\', \'wpse162220_populate_data\' );

3。(b) 显示接收到的数据,我在这里很懒,直接将javascript打印到页面上。您通常会经历注册和;将javascript文件排队。

所有这一切只是将响应打印到控制台。

function wpse162220_print_javascript(){
    ?>  
    <script>
    jQuery(document).ready( function($) {
        $(document).on( \'heartbeat-tick.wpse162220\', function( event, data ) {
            if ( data.hasOwnProperty( \'wpse162220\' ) ) {
                console.log( data );
            }
        });
    });
    </script>
    <?php
}
add_action( \'admin_print_footer_scripts\', \'wpse162220_print_javascript\', 999 );
你应该看到它打印出这样的内容

 Object {wpse162220: "foobar"} 
每隔约4秒发送至控制台。

结束

相关推荐