什么是长轮询
你提供的代码并不是长轮询。长轮询是指允许客户端等待某些事件,使用户界面能够立即响应服务器上的事件。
客户端发送一个常规的ajax请求。服务器端的代码可能会等待,也可能会立即响应。
如果没有要返回的内容(尚未发生事件),则只需使响应时间变长。如果发生了某个等待的事件,则立即发送响应。
客户端轮询您的ajax请求,该请求在某个事件发生之前不会响应,但是当该事件发生时,它会立即响应。客户端需要立即进行另一个长轮询请求。
防止错过事件
因此,通常在长轮询协议中使用序列号。每个事件都分配了一个序列号,新事件的序列号比旧事件高。如果您可以安排这样做,则可以使长轮询成为“获取自id以来的事件”请求。如果他们错过了事件,则会立即返回它们。如果他们给出了最新的序列号,则没有要返回的内容,因此不要返回任何响应,只需让其响应时间变长。
如果多个事件在长轮询之间 sneaked in,则您的轮询将返回多个事件记录。
这需要一种方法,让您的代码通知等待发送响应的代码。您可以将其实现为键值存储的合理速率轮询、某种进程间通信或适合重复使用的轻量级内容。
由于PHP的进程模型,您的选择有些受限。在nodejs或其他单进程服务器架构中,您可以使用一个简单的响应数组等待结果,并在发生新事件时调用它们所有,尊重每个响应的“since”参数。
经典案例
聊天客户端是这种情况的典型示例。聊天页面上的所有人都有一个长轮询等待着获取响应。页面正常工作,只是网络请求在后台花费时间。
当有人输入消息时,他们会将其发布到服务器上,并且处理程序会插入下一个ID的消息。所有长轮询都会注意到新记录大于它们正在查找的“since”值,并且立即为所有ID大于“since”参数的记录发送响应。从而在短时间内通知所有其他聊天参与者,而不使他们不断地检查新消息。