向客户端浏览器推送通知消息

19

我想创建一个应用程序,当超级用户点击链接时,用户应该收到通知,或者像PDF这样的内容,以便他们在屏幕上访问。

用例:当老师想与他的学生分享PDF时,他应该能够通知他的学生有可供下载的PDF,并提供一个链接来完成下载。


有点像发送电子邮件?如果浏览器没有运行呢? - Pointy
这听起来像是一个坏主意。虽然可以按照Distdev所说的方式实现,但在实际应用中会遇到很多问题,而且也不太实用。 - Incognito
用户必须在特定的网页上吗?这与CakePHP有什么关系? - Leo
只有已登录的用户才能收到通知,@Pointy。 - Harsha M V
@Leo想在CakePHP中实现它。因此,如果有任何插件需要指向,请告知。 - Harsha M V
5个回答

24

有几种方法可以实现这个目标。最受支持的方法是通过一种称为Comet或长轮询的技术。基本上,客户端向服务器发送请求,服务器在某些事件发生之前不会发送响应。这给人一种服务器正在向客户端推送数据的假象。

还有其他方法和技术,实际上允许向客户端推送数据而不仅仅是模拟该过程(即Web Sockets),但许多浏览器不支持它们。


11

鉴于您希望在CakePHP中实现此功能(因此我想这是一个基于网络的应用程序),用户必须打开一个“活动”页面才能接收推送消息。

值得一提的是,可以看看前两个答案,还要考虑其他网站如何实现此功能。像Facebook、BBC和Stackoverflow这样的网站都使用技术来保持页面更新。

我猜测Facebook只是使用一些在循环/计时器中运行的AJAX以周期性地拉取更新,以使其看起来像是推送。如果更新请求频率足够高(短时间段),它几乎会实时显示。如果它是长时间段,则会看起来像是一个拉取。找到最适合实时性和浏览器/处理器/网络压力的平衡是关键。

实际请求不应该影响系统,但在某些应用程序中,回复可能会更大。在您的情况下,每个方向上的数据都很小,因此您可以使请求循环相当短。

尝试一下吧!


我使用 5,000 毫秒,即使是具有 128MB RAM 的计算机,也能很好地完成任务。 - user115422
我知道这是一个老问题,但我很好奇...有没有一种通过TCP套接字连接将数据推送到浏览器的方法?通过某种类似AJAX的TCP连接发送小数据包...? - user965369
我认为你做不到。即使你能够做到,这可能会导致你有成千上万个TCP套接字打开的情况。 - Leo

6

标准的HTTP协议不允许服务器向客户端推送数据。你可以通过使用例如小间隔的AJAX请求来模拟这个功能。


1
使用彗星样式的技术(即轮询等)...这里有一篇很好的参考文章:http://www.webreference.com/programming/javascript/rg28/ - jellyfishtree
HTTP不会限制你-如果保持连接活动状态,服务器确实可以在未来的某个时间向客户端推送数据。通常情况下你不会这么做。但是如果你的使用场景合理,你是可以这么做的。当大多数时间轮询数据时都不会得到响应/更新时,会给服务器带来负担,这可能会使你选择真正的推送解决方案。 - Ant Kutschera

6
请查看 php-amqplibRabbitMQ,它们一起可以帮助您实现 AMQP(高级消息队列协议)。基本上,通过将消息推送到网页,可以使您的网页更新。

[编辑] 我最近遇到了Pusher ,并已经在一个项目中实施。它是一个由 HTML5 WebSocket 提供支持的实时消息传递服务。它工作得非常好,并且拥有一个免费的底层计划。此外,它也非常易于实现。


5

在IT技术方面,推荐使用node.js、socket.io和express的组合。这里有一个很好的起点链接


1
我认为这是最简单且全面的解决方案。Socket.io可以很好地从websocket降级到Flash,再到长轮询。你可以在nodejs上实现聊天功能,同时保持你选择的编程语言来开发应用程序。 - James Cowhen
这与PHP有什么关系? - Mr_Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接