使用PHP的彗星?
我正在考虑使用PHP后端实现实时聊天,但是我在一个讨论彗星的网站上跑过这个评论:
我的理解是PHP对于Comet来说是一种糟糕的语言,因为Comet要求你为每个浏览器客户端保持一个持久的连接。 使用mod_php,这意味着每个客户端全部绑定一个Apache子项,而这个客户端根本不能扩展。 我所知道的做Comet的人主要是使用Twisted Python,它可以处理数百或数千个同时连接。
这是真的? 还是可以在周围configuration?
同意/扩大已经说过的话,我不认为FastCGI会解决这个问题。
阿帕奇
对Apache的每个请求都将使用一个工作线程,直到请求完成,这对于COMET请求来说可能是很长的时间。
这篇关于Ajaxian的文章提到了在Apache 上使用COMET,并且这很困难。 这个问题并不是特定于PHP,适用于您可能希望在Apache上使用的任何后端CGI模块。
build议的解决scheme是使用“事件”MPM模块 ,它改变了请求分派给工作线程的方式。
这个MPM试图修复HTTP中的“保持活着的问题”。 客户端完成第一个请求后,客户端可以保持连接打开,并使用相同的套接字发送更多的请求。 这可以节省创buildTCP连接的开销。 然而,Apache传统上保持整个subprocess/线程等待来自客户端的数据,这带来了它自己的缺点。 为了解决这个问题,这个MPM使用一个专用线程来处理Listening套接字和所有处于Keep Alive状态的套接字。
不幸的是,这也不起作用,因为在请求完成后 ,它只会“打盹”,等待来自客户端的新请求。
PHP
现在,考虑到问题的另一方面,即使您通过每个彗星请求阻止一个线程来解决问题,您仍然需要每个请求一个PHP线程 – 这就是为什么FastCGI不会提供帮助。
你需要类似Continuations的东西,当观察到它们被触发的事件时,允许彗星请求被恢复。 AFAIK,这不是在PHP中可能的。 我只看到它在Java中 – 请参阅Apache Tomcat服务器 。
编辑:
这里有一篇关于使用负载平衡器( HAProxy )的文章,允许您在同一台服务器的端口80上运行apache服务器和启用彗星的服务器(例如,jetty,tomcat for Java)。
您可以使用Nginx和JavaScript来实现基于Comet的聊天系统,该系统具有很高的可扩展性,内存或CPU利用率很低。
我有一个非常简单的例子,可以让你开始。 它涵盖了使用NHPM模块编译Nginx,并包含简单的jQuery,PHP和Bash中发布者/订阅者angular色的代码。
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/
PHP
我发现这个有趣的小屏幕录像解释简单的彗星。 作为一个方面说明,我真的认为这将会在任何真正的负载上杀死你的服务器。 当只有几个用户的时候,我会说只是去解决这个问题。 这个解决scheme很容易实现(截屏只需要5分钟的时间:))。 但是,正如我之前所说的,我认为这对很多并发用户来说并不好(猜测你应该对它进行基准testing),因为:
- 它使用的文件I / O比从内存获取数据慢得多。 像例如函数
filemtime()
, - 其次,但我不认为最lessPHP没有一个体面的线程模型。 PHP不是为这个devise的,因为没有共享模式 。 像幻灯片一样,“共享数据被压入数据存储层”就像MySQL一样。
备择scheme
如果你想做任何彗星/长轮询,我真的认为你应该尝试替代scheme。 您可以使用许多语言,例如:
- Java / JVM:Jetty 延续 。
- Python:达斯汀的摇晃 。
- Erlang:彗星的stream行语言等。
- Lua,Ruby,C,Perl等等。
只是执行一个简单的谷歌search,会告诉你很多的select还PHP(我认为在任何大负载将杀死你的服务器)。
mod_php不是使用PHP的唯一方法。 你可以使用fastcgi。 PHP必须用--enable-fastcgi
编译。
PHP作为FastCGI: http : //www.fastcgi.com/drupal/node/5? q = node /10
您也可以尝试https://github.com/reactphp/react
React是用于PHP中事件驱动编程的低级库。 它的核心是一个事件循环,在它之上提供了低级的实用程序,例如:Streams抽象,asynchronousDNSparsing器,networking客户端/服务器,http客户端/服务器,与进程的交互。 第三方库可以使用这些组件来创buildasynchronousnetworking客户端/服务器等等。
事件循环是基于reactor模式(因此是名称),并受到诸如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();
我有类似的问题。 我感兴趣的一个select是使用现有的Comet服务器,如cometd-java或cometd-python作为核心消息中心。 您的PHP代码只是Comet服务器的一个客户端 – 它可以像其他客户端一样发布或读取来自渠道的消息。
这里有一个有趣的代码片段: http : //morglog.org/?p = 22 = 1 ,它实现了这个方法的一部分(尽pipe也有一些debugging代码也在其中传播)。
我目前正在使用socket函数实现一个可伸缩的PHP Comet服务器。 它被称为'phet'([ph] p com [et])
项目页面: http : //github.com/Tim-Smart/phet
免费参与开发。 我目前设法完成了大部分的服务器逻辑,只需要完成客户端的东西。
编辑:最近添加'multithreading'function使用pcntl_fork
方法:)
你将很难在PHP中实现彗星,只是因为它固有的单线程性。
查看Websync On-Demand – 该服务可让您通过服务器端发布来集成PHP,卸载繁重的并发连接,并可让您立即创build实时聊天应用程序。
一个新的模块刚刚出来的Nginx的Web服务器,将允许彗星任何语言,包括PHP。
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
你将不得不在PHP中创build自己的服务器。 使用Apache / mod_php甚至fastcgi都不会扩展。 几岁,但可以让你开始:
PHP-Comet-Server: http : //sourceforge.net/projects/comet/
我认为这是更多的一个问题,有大量的Apache线程运行一直是一个问题。 这将存在任何语言,如果它通过Apache(通常)的方式通过Apache的工作。