【问题标题】:implement Comet with erlang and use it for PHP application用 erlang 实现 Comet 并将其用于 PHP 应用程序
【发布时间】:2023-12-10 18:50:01
【问题描述】:

我正在构建一个 PHP Web 应用程序,并且我已经到了需要构建一个 Comet 服务器的地步,因为每当有新数据可用时我需要更新我的用户(很像 FB)。我花了很多时间在网上搜索,我得出一个结论,构建 Comet 服务器的最佳方法是使用 erlang 构建它。另外我发现 apache-php 不是一个很好的组合,因为每个请求的进程问题。所以,我必须为彗星应用程序构建一个轻量级的 http 服务器。

我在 erlang 世界中完全是新手,但我正在考虑在 erlang 中实现 Comet 服务器,并将其用作仅用于更新客户端的接口。对于我的 Web 应用程序功能的其余部分,我仍然想继续使用 PHP 来实现它们。因此,将更新客户端的请求定向到 erlang 服务器,并将其他请求定向到 apache-php 服务器。

这似乎很复杂。为了构建 Comet 服务器,我需要知道学习 erlang 的最佳方法是什么,以及如何将两种语言(erlang 和 php)结合起来,就像我有新信息时一样。要推送给客户,我需要让 Comet 可以使用新的更改,然后它将信息推送给用户。那么我如何才能从 php 和 erlang 中受益并让它们协同工作。

抱歉,解释太长了,但我真的需要你们的帮助以及你们可能给我的任何指导来学习和实施我想要的东西。提前非常感谢。

编辑: 我应该考虑学习 Python 和 Twisted 来完成我想要的吗?

【问题讨论】:

    标签: php python erlang comet twisted


    【解决方案1】:

    你可以很快地学习 Erlang,你应该能够使用像 gen_server、gen_event 和 OTP 中的那些东西。学习 Erlang 的最快方法应该是按照自己的方式学习文档和示例:http://www.erlang.org/doc/index.html

    对于 PHP 和 Erlang 之间的通信,您可以在 PHP 端使用套接字、fsockopen() 和其余部分,在 Erlang 端使用 gen_tcp。您可以解析从 PHP 端通过管道发送的 Erlang 术语(更多信息here)。

    我从未使用过 Erlang 和 PHP,但我使用 Erlang 和 Python 取得了一些成功,知道 PHP 应该很容易,只需尝试保持一切干净并保持 Erlang 端的状态,仅使用 PHP 来生成 UI。

    【讨论】:

      【解决方案2】:

      您应该查看Yaws。这是一个已经存在了十多年的 Erlang Web 服务器,非常稳定并且仍在积极开发和维护中,并且支持长轮询、PHP 应用程序、WebSockets 等等——几乎所有你想要的东西。

      Yaws 源位于github,其邮件列表为here

      【讨论】:

        【解决方案3】:

        试试 Chicago Boss 框架 here ... 使用它,您不必了解称为 OTP 的东西的具体细节(实际上非​​常简单、强大且经过实战证明),因为 Chicago Boss 的设计师,设法很好地封装它...根据教程。

        在学习 OTP 之后,我现在正在学习它。

        【讨论】:

          【解决方案4】:

          另一个选项是使用 Nginx 和它的推送模块 (http://pushmodule.slact.net/)

          这将允许您从 PHP 中使用 Comet,而无需学习一门新语言。

          【讨论】:

          • 你不认为我会面临同样的问题,因为 PHP 也像 Apache 一样有每个请求的进程问题吗?
          【解决方案5】:

          如果您正在考虑使用 Python 和 Twisted,可以查看 Orbited。他们有非常成熟的 Comet 实现。您可以让 Orbited 通过 STOMP 协议与您的 PHP 应用程序通信。

          这篇文章有一个不错的教程,可以帮助您开始使用 Orbited http://thingsilearned.com/2009/06/09/starting-out-with-comet-orbited-part-1/

          要将您的应用程序与 PHP 集成,您需要在 Google 上搜索 PHP STOMP 客户端

          【讨论】:

            【解决方案6】:

            使用 Erlang 绝对可以做到这一点。一种可能性是使用长轮询,您可以使用 mochiweb 来完成。 http://code.google.com/p/mochiweb/

            另一个想法是使用套接字。在合理数量的浏览器支持 Web 套接字之前,您必须使用闪存“桥”来创建 TCP 连接,并使用 javascript 与服务器通信。看看web socket JS:http://github.com/gimite/web-socket-js

            一旦你完成了这个设置,你就可以在你的 Erlang 进程和 PHP 之间通过如下方式进行通信:http://www.math-hat.com/~zukerman/projects/php-erlang/

            再说一次,如果你还是 Erlang 的新手,从长远来看,也许你会用 Python 和 Twisted 或 Tornado 节省时间。

            【讨论】:

            • 能否请您指导我如何实现 Python+twisted 来实现彗星服务器,是否可以将其与 php 应用程序连接? Python+twisted 能处理很多并发请求吗?
            • 对不起,我没用过 Python/Twisted。我知道它是为一次处理许多请求而构建的,而且我确信 PHP 和 Python 有一种方法可以按照您所说的方式进行通信,但我不知道有什么办法可以做到这一点头。
            【解决方案7】:

            Apache+php 对于彗星风格的应用程序来说确实是一种糟糕的技术。不过,您可以使用许多其他更接近 php 的技术:RubyPython 和 Perl 都应该可用。如果你真的想要,你也可以在 php 中编写某种套接字服务器,但我可能不会打赌让它工作。这并不是说 Erlang 不是一个好的选择,而是有更多的主流替代方案。

            如果您不想使用主流语言,请务必查看node.js,它运行了一些非常令人印象深刻的基准测试。另外,您可能已经了解一点 javascript。

            【讨论】:

            • 我完全同意学习主流语言和接近 PHP 比学习 erlang 更好,但是 python 真的很强大并且可以处理许多并发请求(100K+)吗?对比nodejs、python,哪一个更容易学习,能处理这么多请求呢?感谢您的帮助
            • PHP 的问题是你需要为每个请求占用一个进程。在大多数其他语言中,您可以编写一个简单的网络服务器并为每个请求使用一个线程,在所有等待的请求之间共享资源(例如内存)。你可以在 python 中很好地做到这一点。我不知道这些数字是如何叠加的,所以你可能应该做一些基准测试,但我猜它们相当接近。
            最近更新 更多