Hearbeat API的工作原理是定期向服务器发送XHR请求,并为WordPress/插件/主题提供挂钩,以附加要返回给客户端的数据。一旦返回数据,就会安排一个新的节拍。心跳的速度(或“脉冲”)可以在服务器端或客户端对事件(例如用户不活动)的反应中进行调节。
如果在收到轮询时,服务器没有任何可供客户端使用的信息,则服务器将保持请求打开,并等待响应信息变为可用,而不是发送空响应。一旦完成,服务器立即向客户端发送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秒发送至控制台。