我的研究
我花了几个小时在谷歌和SO上研究Websockets和Long Polling,它们的优缺点等,但还没有找到一个清晰的解决方案。
我读过的关于这个主题的文章比我研究过的任何东西都多,包括这些(举几个例子):
- Ajax/PHP-我应该使用一个长时间运行的脚本还是轮询
- 使用jQuery和PHP进行长轮询
- 针对更改的轮询数据库-Ajax/jQuery
我还研究了以下内容:
- http://cometdproject.dojotoolkit.org/
- http://socket.io/
此问题的理由
乍一看,这个问题可能看起来像是重复的或过于本地化,然而,在我进行了广泛的研究后,我无法收集到足够的信息来做出明智的决定。
因此,我希望你们中的一位天才能抽出时间回答这个问题,并与我们其他人分享你的精彩知识:-)
我的问题
简而言之,我的问题就在标题中;如果我试图检测数据库记录的更改,那么使用websocket(socket.io)还是长轮询(jQuery和AJAX)更好?
如果答案是websockets,那么请包括一个基本的例子,因为这些确实让我感到困惑,即使是谷歌上的所有文章。。。
此外,可能还有其他更好或更适合的方法,如果是这样,请分享,我愿意接受任何建议!
附加信息
这可能不会影响最终的答案,但以防万一,我想解释一下我试图检测到的内容以及一些可能需要考虑的事情。
实际上,我正在尝试检测登录会话的任何更改。换言之,如果数据库中的用户令牌发生了更改或他们的超时时间已用完,那么他们已经注销,我希望显示一条消息通知他们这一点。
我认为这不会有什么不同,但最终的代码需要适合SSL。AJAX很容易做到这一点,但我不熟悉websocket方面
最初,我编写了一个系统,使用javascript从服务器检索超时,然后在timeout
秒内,它会轮询服务器,查看timeout
是否已过期。我认为这是完美的,直到我意识到只有当客户端计算机上的时间与服务器上的时间匹配时,它才起作用。因此,我不得不放弃这个:-(
无论如何,我希望我的问题不要过于本地化,我期待着听到你的观点和答案。请不要浪费时间帮助我编写PHP数据库代码或jQuery AJAX代码,除非其中有复杂的部分,因为我自己能够编写这部分,而且Stack上还有很多其他人比我更需要你的帮助。我更感兴趣的是你的意见,和/或如果websocket是更好的解决方案,如何使用websocket实现这一点:-)。
以下是我看到的关于长轮询和WebSocket API的最佳比较:
http://www.websocket.org/quantum.html
正如上面的文章所说,WebSocket API远优于长轮询(或任何其他伪双向通信),但一个缺点是浏览器支持仍然不完全存在(IE最终开始在IE10中支持WebSocket API)。
因此,如果您正在寻找一个全功能双向通信解决方案,请在WebSocket API可用时使用它,在不可用时使用Ajax长轮询或您喜欢的任何彗星方法。
为了回答您的问题,如果您只是偶尔进行服务器端/DB查询("偶尔"一词是相对的,需要在系统上进行测试),那么简单的Ajax请求应该是可以的。然而,如果您每10秒或更短时间就向服务器发送一次请求,那么使用WebSocket API绝对是理想的选择。
为了回答您的最后一个问题,WebSocket API可以100%使用SSL。只需使用wss协议而不是标准的ws协议,您就可以做到这一点。
您在部分中写道"…我正在尝试检测数据库记录的更改…";这不是它的目的。)
在我看来,一个经济的实现让变更代理(在您的情况下是注销)在变更时通知侦听器,而不是以某种方式进行监视以检测该变更。
我的意思是,数据库被一些特定的脚本操作更改了。我会考虑扩展这些操作中的每一个,以触发websocket事务。