发送PHP脚本的服务器是否必须轮询?

发送PHP脚本的服务器是否必须轮询?,php,ajax,server-sent-events,Php,Ajax,Server Sent Events,我有一个主要由javascript/ajax驱动的web应用程序,有点类似于google文档的工作方式;所有浏览页面的人都将相对实时地看到相同的信息。信息是否实时并不重要,一秒钟左右就可以了 目前,应用程序每5秒调整一次服务器。我正在研究服务器发送的事件,它们听起来正是我需要的。。。但我的理解是:服务器发送的事件本质上只是将轮询移动到服务器。执行服务器发送事件的PHP脚本将每隔X秒检查数据库的更改,并在发现更改时向应用程序发送更新 每秒检查一次可能就足够了,但由于我使用的是共享主机,所以我希望尽

我有一个主要由javascript/ajax驱动的web应用程序,有点类似于google文档的工作方式;所有浏览页面的人都将相对实时地看到相同的信息。信息是否实时并不重要,一秒钟左右就可以了

目前,应用程序每5秒调整一次服务器。我正在研究服务器发送的事件,它们听起来正是我需要的。。。但我的理解是:服务器发送的事件本质上只是将轮询移动到服务器。执行服务器发送事件的PHP脚本将每隔X秒检查数据库的更改,并在发现更改时向应用程序发送更新


每秒检查一次可能就足够了,但由于我使用的是共享主机,所以我希望尽可能避免任何不必要的负载。有没有办法订阅数据库更新?或者,是否有一种方法可以通知其他PHP脚本中对数据库进行更改的脚本?

我建议不要轮询数据库进行更改,因为您的应用程序将进行更改,您将知道何时会发生数据库更改。我将使用websockets()并在任何成员进行更改时将更新推送到所有活动客户端

下面是服务器发送事件和Web套接字之间的区别。(在您的情况下,Web套接字是一个不错的选择)

WebSocket和SSE(服务器发送事件)都能够将数据推送到浏览器,但它们不是相互竞争的技术

WebSocket连接既可以向浏览器发送数据,也可以从浏览器接收数据。可以使用WebSocket的应用程序的一个很好的例子是聊天应用程序

SSE连接只能将数据推送到浏览器。在线股票报价,或推特更新时间线或提要,都是可以从SSE获益的应用程序的好例子

实际上,由于使用SSE可以完成的一切都可以通过WebSocket完成,WebSocket得到了更多的关注和喜爱,支持WebSocket的浏览器也比SSE多得多


但是,对于某些类型的应用程序来说,这可能会有点过头,后端可能更容易使用SSE等协议实现。

对于PHP,轮询DB是实现这一点的典型方法。您还可以使用TCP/IP套接字连接到某种应用程序服务器,它位于您的数据库前面,并且了解所有写入程序和所有使用者。也就是说,当写入时,它会将其广播给所有使用者,并将其写入数据库。该示例中的使用者是PHP脚本(每个SSE客户端一个)

如果您使用WebSocket,那么您需要完全相同的体系结构,因为PHP是单线程的:每个SSE连接都是一个独立的PHP进程

如果您切换到使用node.js,那么应用服务器可以内置。(同样,无论是SSE还是WebSockets,它都会以同样的方式工作。)

但是,您提到您打算使用共享主机。SSE(以及WebSockets和comet technologies)保持套接字打开,这会影响共享托管的经济性。因此,您的插座可能会定期关闭。我的建议是坚持每5秒进行一次ajax(以及DB)轮询,而不是SSE轮询,直到您的应用程序的价值足以让真正的主机每月10-100美元不成问题。然后考虑使用SSE优化延迟时间。
另外,SSE和WebSockets之间的决定都与写入频率有关。我的指导原则是,如果您的客户机平均每秒写入一次或更频繁地写入数据,那么web套接字会更好,因为它可以保持写入通道的开放性。如果每5秒多一次,那么与每次有数据要写时只使用Ajax帖子相比,websockets不会带来多少好处。SSE后端比WebSockets后端更容易处理。(灰色区域为每1-5秒写入一次。)

那么我想我会问,服务器发送事件的目的是什么?它们只是一个噱头吗?不,它们不是,它们有两种不同的功能。请参阅我的最新答案。