我有一个主要由javascript / ajax驱动的网络应用程序,有点类似于谷歌文档的工作方式;观看页面的所有人都将相对实时地看到相同的信息。信息实际上是实时的,大约一秒左右是不错的。
目前,该应用程序每5秒钟调整一次服务器。我正在研究服务器发送的事件,它们听起来就像我需要的......但这是我的理解:服务器发送的事件基本上只是将轮询移动到服务器。执行服务器发送事件的PHP脚本将每隔X秒检查数据库是否有更改,并在找到应用程序时向应用程序发送更新。
每秒检查一次可能就足够了,但由于我在共享主机上,我想避免任何不必要的负载。有没有办法可以订阅数据库的更新?或者有没有办法可以从其他PHP脚本中通知脚本来更改数据库?
答案 0 :(得分:2)
使用PHP,轮询数据库是执行此操作的典型方法。您还可以使用TCP / IP套接字连接到位于数据库前面的某种应用程序服务器,并了解所有编写者和所有使用者。即当写入进来时,它会将其广播给所有消费者并将其写入数据库。该示例中的消费者是PHP脚本(每个SSE客户端一个)。
如果您使用WebSockets,那么您需要完全相同的架构,因为PHP是单线程的:每个SSE连接都是一个独立的PHP进程。
如果切换到使用node.js,那么该应用程序服务器可以内置。 (同样,无论是SSE还是WebSockets,它的工作方式都是一样的。)
但是,你提到你打算使用共享主机。 SSE(以及WebSockets和彗星技术)保持套接字打开,这会干扰共享托管的经济性。所以你的插座可能会定期关闭。我的建议是坚持使用ajax(以及数据库)每5秒进行一次轮询,而不是SSE,直到你的应用程序足够值,真正主机的10美元/ 100美元/月不是问题。然后考虑使用SSE来优化延迟。
P.S。 SSE和WebSockets之间的决定都与写频率有关。我的指导原则是,如果您的客户写数据,平均而言,每秒一次或更频繁,Web套接字更好,因为它保持写通道打开。如果每5秒钟一次,那么Web套接字不会带来太多,相比之下每次有数据写入时只使用Ajax帖子。 SSE后端比WebSockets后端更易于处理。 (每1-5秒写一次是灰色区域。)
答案 1 :(得分:0)
我建议不是轮询数据库以进行更改,而是知道何时会发生数据库更改,因为您的应用程序将进行更改。我会使用Web套接字(https://developer.mozilla.org/en-US/docs/WebSockets),只需在任何成员进行更改时将更新推送到所有活动客户端。
以下是服务器发送事件和Web套接字之间的区别。 (在你的情况下,Web套接字是要走的路)
Websockets和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是竞争技术。
Websockets连接既可以将数据发送到浏览器,也可以从浏览器接收数据。可以使用websockets的应用程序的一个很好的例子是聊天应用程序。
SSE连接只能将数据推送到浏览器。在线股票报价或更新时间轴或订阅源的twitters是可以从SSE中受益的应用程序的良好示例。
在实践中,由于SSE可以完成的所有工作也可以通过Websockets完成,因此Websockets受到越来越多的关注和喜爱,并且更多的浏览器支持Websockets而不是SSE。
但是,对于某些类型的应用程序来说,它可能会过度,并且使用SSE等协议可以更容易地实现后端。