Long Polling或Comet如何使用PHP?

时间:2013-02-18 17:27:19

标签: php javascript ajax long-polling polling

我正在为我的网站制作通知系统。我希望登录的用户在发出通知时立即注意到。正如许多人所说,只有几种方法可以这样做。

一个是编写一些javascript代码来询问服务器“是否有任何新通知?”在给定的时间间隔。它被称为“轮询”(我应该是对的)。

另一个是“长轮询”或“彗星”。正如维基百科所说,长期民意调查与民意调查相似。无需每次都询问新通知,当新通知可用时,服务器会将它们直接发送到客户端。

那么如何使用PHP进行长轮询? (不需要完整的源代码,但这样做的方法) 它的架构/设计究竟是什么?

4 个答案:

答案 0 :(得分:3)

长轮询的基本思想是发送一个请求,然后服务器才会响应或终止该请求,直到达到某个所需条件。即服务器端没有通过发送响应来“完成”服务请求。您可以通过在服务器端保持循环执行来实现此目的。

想象一下,在每个循环中,您都会进行数据库查询或者您需要的任何内容,以确定您所需的条件现在是否为真。只有当它打破了循环并将响应发送给客户端时。当客户端收到响应时,会立即重新发送“长轮询”请求,这样就不会错过下一个“通知”。

服务器端PHP代码的简化示例可能是:

// Set the loop to run 28 times, sleeping 2 seconds between each loop.
for($i = 1; $i < 29; $i++) {

    // find out if the condition is satisfied.
    // If YES, break the loop and send response     

    sleep(2);
}
// If nothing happened (the condition didn't satisfy) during the 28 loops,
// respond with a special response indicating no results. This helps avoiding
// problems of 'max_execution_time' reached. Still, the client should re-send the
// long-polling request even in this case.

答案 1 :(得分:1)

您可以使用(或学习)一些现有的实现,例如Ratchet。还有其他一些。

基本上,您需要避免让apache或Web服务器处理请求。就像使用node.js服务器一样,您可以从命令行启动PHP并使用server socket函数创建服务器并使用socket_select来处理通信。

通过保持循环活动,技术上可以在Web服务器上工作。但是,每个HTTP连接保持php进程活动的内存开销通常太高。创建自己的服务器允许您在连接之间共享内存。

答案 2 :(得分:1)

我最近使用长轮询聊天应用程序。经过一番研究并玩了一段时间后,我会推荐一些东西。

1)不要长时间轮询超过20秒。有些浏览器会超时。我通常设置我的长轮询运行大约20秒并在那时发回一个空响应。然后你可以使用javascript重新启动长轮询。

2)每隔一段时间浏览器就会挂机。为了帮助添加第二级错误检查,我有一个javascript计时器运行30秒,如果30秒内没有响应,我放弃了ajax调用并重新启动它。

3)如果您使用的是php,请确保使用session_write_close()

4)如果您在Jquery中使用ajax,则可能需要使用abort()

答案 3 :(得分:0)

您可以找到答案here。更多细节here。你应该记得在使用jquery时使用$.ajaxSetup({ cache:false });