引用: 我的理解是,PHP对于Comet来说是一个可怕的语言,因为Comet要求你对每个浏览器客户端保持持久连接。使用mod_php意味着为每个客户端绑定一个Apache子进程,这在规模上根本无法扩展。我认识的做Comet的人大多使用Twisted Python,它专门设计用于处理数百或数千个同时连接。
这是真的吗?还是有办法可以解决这个问题?
每个进入Apache的请求将使用一个工作线程,直到请求完成,对于COMET请求可能需要很长时间。
这篇关于Ajaxian的文章提到在Apache上使用COMET,并且这很困难。这个问题不是特定于PHP的,适用于您想要在Apache上使用的任何后端CGI模块。
建议的解决方案是使用'event' MPM模块,它改变了请求分派给工作线程的方式。
这种MPM试图修复HTTP中的“保持活动问题”。 在客户端完成第一个请求之后,客户端可以保持连接打开,并使用相同的套接字发送进一步的请求。这可以节省创建TCP连接的显着开销。但是,Apache传统上会保持整个子进程/线程等待来自客户端的数据,这带来了自己的缺点。为了解决这个问题,这个MPM使用一个专用线程来处理监听套接字和所有处于保持活动状态的套接字。
不幸的是,这也行不通,因为它只会在请求完成后“休眠”,等待客户端的新请求。
你可以使用Nginx和JavaScript实现一个基于Comet的聊天系统,它非常可扩展,占用很少的内存和CPU资源。
我这里有一个非常简单的例子,可以让你开始。它涵盖了使用NHPM模块编译Nginx以及在jQuery、PHP和Bash中实现简单发布者/订阅者角色的代码。
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/
我发现了这个有趣的屏幕录像,解释了简单的Comet。顺便说一句,在任何真正的负载下,我真的认为这会使您的服务器崩溃。当只有几个用户时,我建议您选择这个解决方案。这个解决方案非常容易实现(屏幕录像只需要花费您5分钟的时间:))。但是,正如我之前所说,我认为它不适合许多并发用户(猜测您应该对其进行基准测试;)),因为:
filemtime()
,如果您想执行任何Comet /长轮询操作,我真的认为您应该尝试替代方案。您可以使用许多语言,例如:
进行简单的谷歌搜索,会显示出许多替代方案,还有PHP(我认为在任何大负载下都会使您的服务器崩溃)。
mod_php并不是使用PHP的唯一方式,您可以使用fastcgi。必须使用--enable-fastcgi
编译PHP。
PHP作为FastCGI:http://www.fastcgi.com/drupal/node/5?q=node/10
React是一个用于PHP事件驱动编程的低级库。它的核心是事件循环,除此之外,它还提供了一些低级工具,例如:流抽象、异步DNS解析器、网络客户端/服务器、HTTP客户端/服务器以及与进程的交互。第三方库可以使用这些组件来创建异步网络客户端/服务器等。
事件循环基于反应器模式(因此得名),并受到诸如EventMachine(Ruby)、Twisted(Python)和Node.js(V8)等库的强烈启发。
入门示例展示了一个简单的HTTP服务器侦听端口1337:
<?php
$i = 0;
$app = function ($request, $response) use (&$i) {
$i++;
$text = "This is request number $i.\n";
$headers = array('Content-Type' => 'text/plain');
$response->writeHead(200, $headers);
$response->end($text);
};
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket);
$http->on('request', $app);
$socket->listen(1337);
$loop->run();
pcntl_fork
方法添加了“多线程”功能 :)由于PHP本身是单线程的,因此在实现comet时可能会遇到困难。
请查看Websync On-Demand - 该服务允许您通过服务器端发布将PHP集成,卸载繁重的并发连接工作,并使您能够快速创建实时聊天应用程序。
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
你需要在PHP中创建自己的服务器。使用Apache/mod_php或者fastcgi都无法扩展。这是几年前的技术,但可以帮助你入门:
PHP-Comet-Server: http://sourceforge.net/projects/comet/