一尘不染

在PHP中使用Comet吗?

php

我当时在考虑使用PHP后端实现实时聊天,但在讨论彗星的网站上遇到了以下评论:

我的理解是,PHP是Comet的一种糟糕的语言,因为Comet要求您保持对每个浏览器客户端开放的持久连接。使用mod_php意味着为每个客户端完全占用一个Apache子节点,而这根本无法扩展。我认识的从事Comet工作的人大多使用TwistedPython,该工具旨在处理数百或数千个同时连接。

这是真的?还是可以配置的东西?


阅读 405

收藏
2020-05-26

共1个答案

一尘不染

同意/扩展已经说过的内容,我认为FastCGI不能解决问题。

Apache

进入Apache的每个请求都将使用一个工作线程,直到请求完成为止,这对于COMET请求来说可能是很长的时间。

关于Ajaxian的这篇文章提到在Apache上使用COMET,这很困难。该问题并非特定于PHP,它适用于您可能想在Apache上使用的任何后端CGI模块。

建议的解决方案是使用“事件”MPM模块,该模块更改将请求分配到工作线程的方式。

该MPM尝试修复HTTP中的“保持活动状态”。客户端完成第一个请求后,客户端可以保持连接打开,并使用同一套接字发送其他请求。这样可以节省创建TCP连接时的大量开销。但是,Apache传统上会保留整个子进程/线程来等待来自客户端的数据,这有其自身的缺点。为了解决此问题,该MPM使用专用线程来处理侦听套接字和处于“保持活动”状态的所有套接字。

不幸的是,这也不起作用,因为它只会 请求完成后才“打no” ,等待客户端的新请求。

PHP

现在,考虑问题的另一面,即使通过在每个彗星请求中保留一个线程来解决该问题,每个请求仍将需要一个PHP线程-这就是为什么FastCGI无法提供帮助。

您需要像Continuations这样的东西,当观察到彗星请求触发事件时,它可以恢复。AFAIK,这在PHP中是不可能的。我只在Java中看到过它-请参阅Apache Tomcat服务器。

编辑:

这里有一篇关于使用负载平衡器(HAProxy)的文章,它允许您在同一服务器的端口80上同时运行apache服务器和启用了彗星的服务器(例如,jetty,tomcatfor Java)。

2020-05-26