用Erlang实现Comet并在PHP应用中使用

3 投票
7 回答
849 浏览
提问于 2025-04-15 17:22

我正在开发一个PHP的网页应用,现在我需要搭建一个Comet服务器,因为我想在有新数据时及时更新用户的信息(就像Facebook那样)。我花了很多时间在网上查资料,最后得出结论,搭建Comet服务器最好用Erlang。而且我发现用Apache和PHP组合来做这个并不好,因为每个请求都要启动一个新进程,这样效率不高。所以,我需要为Comet应用搭建一个轻量级的HTTP服务器。

我对Erlang完全是个新手,但我想用Erlang来实现Comet服务器,让它专门负责更新客户端的信息。至于我网页应用的其他功能,我还是想继续用PHP来实现。所以我打算把更新客户端的请求发给Erlang服务器,而把其他请求发给Apache-PHP服务器。

这听起来很复杂。我想知道学习Erlang的最佳方法是什么,以便能搭建Comet服务器,以及如何把Erlang和PHP结合起来,让它们一起工作。比如,当我有新信息需要推送给客户端时,我需要把这些新变化传给Comet,然后它再把信息推送给用户。那么,我该如何利用PHP和Erlang,让它们协同工作呢?

抱歉解释得这么长,但我真的需要你们的帮助,任何建议都非常感谢!

编辑:我是否应该考虑学习Python和Twisted来实现我的目标?

7 个回答

2

用Apache和PHP来做类似Comet风格的应用确实不是个好主意。不过,你可以试试其他一些和PHP更接近的技术,比如RubyPython和Perl,这些都可以用来做类似的事情。如果你真的想用PHP,也可以尝试写一个socket服务器,但我觉得成功的可能性不大。不过,这并不是说Erlang就不好,只是还有很多更常用的选择。

如果你不想用那些主流语言,可以看看node.js,它的性能测试结果非常不错。而且你可能已经对JavaScript有一点了解。

2

你可以很快学会Erlang这门语言,像gen_server、gen_event这些OTP里的东西你都能用上。学习Erlang最快的方法就是通过文档和示例来学习,地址是:http://www.erlang.org/doc/index.html

如果你想让PHP和Erlang之间进行通信,可以使用套接字,PHP那边用fsockopen()等函数,Erlang那边用gen_tcp。你可以在PHP那边解析通过管道发送过来的Erlang数据(更多信息可以在这里找到)。

我自己没有用过Erlang和PHP,但我用过Erlang和Python,效果还不错。如果你会PHP,那应该也不难,只要保持代码整洁,把状态放在Erlang那边,PHP主要用来生成用户界面就可以了。

3

用Erlang实现这个功能是完全可行的。一个方法是使用长轮询,这可以通过mochiweb来实现。你可以在这里找到mochiweb的相关信息:http://code.google.com/p/mochiweb/

另一个想法是使用套接字(sockets)。在大多数浏览器还不支持网页套接字的情况下,你需要用Flash做一个“桥梁”来建立TCP连接,然后用JavaScript和服务器进行通信。你可以查看这个网页套接字的JavaScript库:http://github.com/gimite/web-socket-js

一旦你设置好了这些,你就可以用类似下面的方式在Erlang进程和PHP之间进行通信:http://www.math-hat.com/~zukerman/projects/php-erlang/

不过,如果你对Erlang还是个新手,或许用Python和Twisted或Tornado会更省时间。

撰写回答