我为我的网站实施了一个longpoll机制,它保持与客户端的连接打开最多30秒,并且只有在请求的资源在这30秒内发生变化时才发送答案,否则它会发送状态400.
这是我用于机制的代码:(它是 Sinatra 服务器的一部分)
get '/longpoll' do
state = Array.new( $callbacks )
0.upto 60 do |i|
if $callbacks != state
return json $callbacks
end
sleep 0.5
end
400
end
$callbacks
是一个全局数组,在发布新的回调或删除完成的回调时会更改。我的客户端只需要在新的回调到达或旧的回调消失时动态更新。在客户端a $.ajax()
- 如果收到答复,呼叫请求资源并更新网站。否则它只是继续轮询。
当我自己执行Sinatra服务器时,一切正常。如果有任何变化,客户端会得到答案,或者30秒后错误“400”。
但是当我使用Passenger和Apache2开始整个事情时,它总是在30秒后以'400'响应,无论$回调是否改变。我的其余Sinatra代码在Apache2和Passenger中运行良好,当我手动检查$ callbacks对象时,它会显示更改。它只是不识别if语句中的变化。