小编典典
同意/扩展已经说过的内容,我认为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