我正在考虑使用 PHP 后端实现实时聊天,但我在讨论 comet 的网站上看到了这样的评论:
我的理解是 PHP 是
彗星的语言很糟糕,因为
Comet 要求你保留一个
对每个人开放的持久连接
浏览器客户端。使用 mod_php 这个
意味着捆绑一个阿帕奇孩子
为每个客户全职工作
根本无法扩展。我的人
知道做Comet的东西主要是
使用 Twisted Python 设计
处理数百或数千
同时连接。
这是真的?或者它是可以配置的东西吗?
同意/扩展已经说过的内容,我认为 FastCGI 不会解决问题。
Apache
每个对 Apache 的请求都将使用一个工作线程,直到请求完成,这对于 COMET 请求来说可能会很长。
这篇关于阿贾克斯的文章提到在 Apache 上使用 COMET,而且这很困难。该问题并非 PHP 特有,并且适用于您可能想要在 Apache 上使用的任何后端 CGI 模块。
建议的解决方案是使用“事件”MPM 模块这改变了将请求分派到工作线程的方式。
此 MPM 尝试修复
HTTP 中的“保持活动问题”。
客户完成第一个任务后
请求时,客户端可以保留
连接打开,并进一步发送
使用相同套接字的请求。这
可以节省大量开销
创建 TCP 连接。然而,
Apache 传统上保留整个
等待数据的子进程/线程
来自客户,它带来了自己的
缺点。为了解决这个问题,
该 MPM 使用专用线程来
处理两个监听套接字,并且
Keep Alive 中的所有套接字
状态。
不幸的是,这也不起作用,因为它只会“打盹”after请求完成,等待客户端的新请求。
PHP
现在,考虑到问题的另一面,即使您解决了每个 comet 请求占用一个线程的问题,每个请求仍然需要一个 PHP 线程 - 这就是 FastCGI 无济于事的原因。
你需要类似的东西延续当观察到彗星请求所触发的事件时,它允许恢复彗星请求。 AFAIK,这在 PHP 中是不可能的。我只在 Java 中见过它 - 请参阅 ApacheTomcat服务器.
Edit:
有一个文章在这里关于使用负载均衡器(HAProxy)以允许您在同一服务器的端口 80 上运行 apache 服务器和支持 comet 的服务器(例如 jetty、用于 Java 的 tomcat)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)