Comet风格的消息传递:如何在没有轮询的情况下实现服务器部分?

时间:2010-08-18 18:14:46

标签: php mysql ajax comet long-polling

我正在计划一个类似聊天的Web应用程序,每当有一个用户发布内容时,所有其他用户(即浏览器指向该网站的用户)都会获得即时更新。常见的选择是使用长轮询AJAX请求的彗星式消息传递。用jQuery编写客户端部分不是什么大问题。

但我想知道如何在PHP中最好地实现服务器端部分。帖子/消息将存储在MySQL中,问题是:在向数据库写入新帖子后,如何通知所有等待请求,没有使用轮询的数据?轮询会起作用,但它很丑陋,浪费资源,因此,这是我不想要的:

while (timeout not reached) {
    if ($database->has_changes())
        break;
    sleep(1);
}
handle_changes_if_any();

是否有某种MySQL功能可以帮助我?某种IPC有帮助吗?服务器运行Apache。

1 个答案:

答案 0 :(得分:0)

您已经提到过一种可能的解决方案,即使用AJAX轮询定期查询脚本以进行更新。轮询将在客户端完成,与服务器端无关。

另一种选择是使用诸如Meteor之类的彗星服务器。使用此方法,您的PHP脚本可以通知彗星服务器新消息,并且连接的客户端将接收更新。然后,您可以编写JavaScript来向用户显示更新。