apache 如何使一个即时消息而不垃圾邮件的数据库

mrzz3bfm  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(132)

我目前正在开发一个即时通讯系统。但是,我在优化方面遇到了问题。下面是我目前的代码:

<script>
   setInterval('load_messages()', 500);
   function load_messages(){
       $('#messages').load('loadMessages.php');
   }
</script>

除此之外,最好使用 AJAX 请求来只请求在定义的时间戳之后的消息。有没有一种方法可以将数据包从发送方的页面传递到接收方以进行刷新,从而避免垃圾邮件数据库。下面是一个模式,解释我想做的事情:

在php、apache或javascript中有什么方法可以做到这一点吗?
感谢阅读

9udxz4iz

9udxz4iz1#

您使用的技术称为短轮询。它基本上是向服务器发送垃圾邮件,直到服务器有新的内容显示给您。看起来像这样:

Client: cookie?
Server: no
Client: cookie?
Server: no
Client: cookie?
Server: no
Client: cookie?
Server: yes; here's the cookie: 🍪
Client: cookie?
Server: no
...

正如您自己所理解的,这确实是低效的;我不知道还有哪个网站还在使用短投票。
你还有其他的选择。最简单的一个(假设你使用的是PHP)是长轮询。基本上,你发送一个请求,服务器只是暂停请求,一旦有新的消息到来,服务器就发回响应。这样你就可以立即得到消息,而不必发送那么多消息:

Client: tell me when you have a cookie...
[loads for 1m 32s]
Server: the cookie has come [sends response]
Client: tell me when you have a cookie...
...

然而,Apache通过为每个请求创建一个新的线程来处理并发请求。因此,如果您有两个用户在聊天,这没问题。但是假设您有很多房间,总共有100,000个用户在长时间轮询您的服务器。您的服务器可能无法处理那么多线程,并且会崩溃。(NodeJS由于其事件驱动的架构和内置的异步性而在实时应用程序中非常流行。)
但还有其他更好的选择:

  1. Web套接字:这基本上是客户端和服务器之间的一个持久连接(直到连接被手动关闭),所以客户端不必太多地窃听服务器。每当服务器有消息时,它会立即发送给客户端,反之亦然。Here's a good article。这是实时应用最流行的解决方案,大多数聊天应用都实现了这一点,如Discord或Slack。
  2. SSE(服务器发送的事件):基本上,服务器可以将数据发送给客户机,而不是客户机向服务器请求数据。如果您想了解它的工作原理,请参阅another article

**您的上下文:**SSE在PHP中很容易实现,不需要额外的库;另一方面,Websockets的设置有点复杂(可能需要像rachet这样的第三方库),但由于它的工作性能很好,我可能会考虑这样做。
**您的问题:**是否有一种方法可以将数据包从发送者的页面传递到接收者以进行刷新,从而避免垃圾邮件发送到数据库? 如果我准确地回答您的问题,SSE。

相关问题