将彗星与 PHP 结合使用?
我正在考虑使用PHP后端实现实时聊天,但我在一个讨论彗星的网站上遇到了这个评论:
我的理解是,PHP对于 Comet 来说是一种糟糕的语言,因为 Comet 要求你保持与每个浏览器客户端的持久连接。使用mod_php这意味着为每个客户端全职雇用一个Apache孩子,这根本无法扩展。我认识的做彗星工作的人大多使用Twisted Python,它旨在处理数百或数千个同时连接。
这是真的吗?还是可以配置的东西?
我正在考虑使用PHP后端实现实时聊天,但我在一个讨论彗星的网站上遇到了这个评论:
我的理解是,PHP对于 Comet 来说是一种糟糕的语言,因为 Comet 要求你保持与每个浏览器客户端的持久连接。使用mod_php这意味着为每个客户端全职雇用一个Apache孩子,这根本无法扩展。我认识的做彗星工作的人大多使用Twisted Python,它旨在处理数百或数千个同时连接。
这是真的吗?还是可以配置的东西?
同意/扩展已经说过的内容,我不认为FastCGI会解决问题。
Apache中的每个请求将使用一个工作线程,直到请求完成,这对于 COMET 请求来说可能是很长的时间。
这篇关于Ajaxian的文章提到在Apache上使用COMET,这很困难。这个问题不是PHP特有的,它适用于你可能想在Apache上使用的任何后端CGI模块。
建议的解决方案是使用“事件”MPM模块,该模块改变了将请求分派给工作线程的方式。
此 MPM 尝试修复 HTTP 中的“保持活动状态问题”。客户端完成第一个请求后,客户端可以保持连接打开状态,并使用相同的套接字发送进一步的请求。这可以节省创建 TCP 连接时的重大开销。但是,Apache传统上会保留整个子进程/线程等待来自客户端的数据,这带来了自己的缺点。为了解决此问题,此 MPM 使用专用线程来处理侦听套接字和处于“保持活动状态”的所有套接字。
不幸的是,这也不起作用,因为它只会在请求完成后“延后”,等待来自客户端的新请求。
现在,考虑到问题的另一面,即使你解决了每个彗星请求保留一个线程的问题,你仍然需要每个请求一个PHP线程 - 这就是为什么FastCGI没有帮助。
你需要类似延续的东西,它允许在观察到彗星请求触发的事件时恢复。AFAIK,这在PHP中是不可能的。我只在Java中见过它 - 参见Apache Tomcat服务器。
编辑:
这里有一篇关于使用负载均衡器(HAProxy)的文章,允许您在同一服务器的端口80上运行apache服务器和支持彗星的服务器(例如jetty,tomcat for Java)。
您可以使用Nginx和JavaScript来实现基于Comet的聊天系统,该系统非常可扩展,几乎没有内存或CPU利用率。
我这里有一个非常简单的例子,可以让你入门。它涵盖了使用NHPM模块编译Nginx,并包括jQuery,PHP和Bash中简单发布者/订阅者角色的代码。
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/