我最近注意到,在Heartbeat API js客户端中,添加了一个选项,称为“长轮询”,间隔为0。我非常理解他们试图实现什么,但我对如何使用此功能实现插件感到困惑。
现在,每当我的服务器收到来自浏览器的请求时,就会触发钩子,查询数据,创建响应并发送回客户端。但如果间隔为0,我实际上应该在挂钩中等待某个事件被触发,然后创建响应,对吗?
有人能提供一些简单的代码作为这个新特性的示例吗?
我最近注意到,在Heartbeat API js客户端中,添加了一个选项,称为“长轮询”,间隔为0。我非常理解他们试图实现什么,但我对如何使用此功能实现插件感到困惑。
现在,每当我的服务器收到来自浏览器的请求时,就会触发钩子,查询数据,创建响应并发送回客户端。但如果间隔为0,我实际上应该在挂钩中等待某个事件被触发,然后创建响应,对吗?
有人能提供一些简单的代码作为这个新特性的示例吗?
Hearbeat API的工作原理是定期向服务器发送XHR请求,并为WordPress/插件/主题提供挂钩,以附加要返回给客户端的数据。一旦返回数据,就会安排一个新的节拍。心跳的速度(或“脉冲”)可以在服务器端或客户端对事件(例如用户不活动)的反应中进行调节。
如果在收到轮询时,服务器没有任何可供客户端使用的信息,则服务器将保持请求打开,并等待响应信息变为可用,而不是发送空响应。一旦完成,服务器立即向客户端发送HTTP/S响应,完成打开HTTP/S请求。
因此,我们发送一个请求,服务器在数据准备就绪时将其发送回,而不是定期发送请求并希望我们得到一些反馈。一旦发生,我们immediately 启动新的XHR请求,因此间隔为0。
但简而言之,缺点/潜在问题包括:
function wpse162220_heartbeat_settings( $settings ) {
$settings[\'interval\'] = \'long-polling\';
return $settings;
}
add_filter( \'heartbeat_settings\', \'wpse162220_heartbeat_settings\' );
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\' );
function wpse162220_populate_data( $value ){
static $counter = 0;
$counter++;
if( $counter == 3 ){
$value[\'wpse162220\'] = \'foobar\';
}
return $value;
}
add_filter( \'wpse162220_poll\', \'wpse162220_populate_data\' );
所有这一切只是将响应打印到控制台。
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秒发送至控制台。