【问题标题】:interfacing erlang application with php将erlang应用程序与php接口
【发布时间】:2009-11-21 20:28:51
【问题描述】:

我有一个用 PHP 构建的网站。 我有一个 Erlang 应用程序在同一台服务器上作为守护进程运行。 我需要从 PHP 调用 Erlang 应用程序上的函数并返回结果。

我找到了 PHP/Erlang 和 PHP 模块,但我无法在此服务器上安装 PHP 模块,我只能使用 PHP 代码。

我知道解决它的唯一方法是在本地运行一个 PHP 能够与之通信的 Erlang Web 服务器。

有没有更好的解决方法? 如果使用 httpd 服务器是最好的方法,我应该使用什么 Erlang 服务器? 它应该尽可能轻,不需要 SSL 之类的功能,也不需要处理大负载。

谢谢

【问题讨论】:

    标签: php erlang marshalling


    【解决方案1】:

    我会运行一个网络服务器,例如 mochiweb 托管 erlang 代码。 PHP 代码将使用curl 发送以JSON 编码的http 查询到mochiweb。 Mochiweb 有 JSON 编码器/解码器,PHP 有原生 JSON 支持。

    即使所有东西都在同一台服务器上,也只需使用 HTTP。处理所有低级别的东西,如果你需要扩展,它会更容易,因为使用 HTTP 扩展是一个已解决的问题。 Mochiweb 轻巧且具有高性能。

    【讨论】:

      【解决方案2】:

      Erlang 在套接字 I/O 方面表现出色:也许您可以使用某种管道?

      这肯定比通过另一个 WEB 服务器层更直接。

      使用函数 erlang:open_porterlang:port_command 函数通过系统端口将数据输入/输出 Erlang。

      【讨论】:

      • 你能解释一下“某种管道”是什么意思吗?我需要在 erlang 端做什么以及如何从 php 调用它?
      • 您在 Erlang 端为自己编写一个 gen_server 来打开一个套接字,在 PHP 端您也使用一个套接字 (ca.php.net/sockets)。在数据交换格式方面,您可以使用 XML 或 JSON。
      • 套接字是否是线程安全的,这意味着两个 erlang 进程可以将消息发送到 gen_server 正在侦听的同一个套接字?谷歌协议缓冲区是否与code.google.com/apis/protocolbuffers/docs/overview.html 相关,或者它只是一种更有效的数据传递方式。就我而言,简单性比效率重要得多。谢谢
      • (你考虑过输入单独的问题吗?) - Erlang 是非常线程安全的;事实上,它擅长线程。 - Google Protocols Buffers:关于这些,我知道的还不够多。
      【解决方案3】:

      $ cat erl.erl

      #!/usr/bin/env escript
      
      main(Args) ->
          io:format("~p\n", [Args]),
          io:format("~p\n", [(catch test(Args))]).
      
      test([N1,N2|_]) ->
          lists:seq(list_to_integer(N1),list_to_integer(N2)).
      

      $ chmod +x erl.erl

      $ cat php.php

      ?php
      var_dump(exec("./erl.erl 1 5"));
      ?>
      

      $ php php.php

      字符串(11)“[1,2,3,4,5]”

      【讨论】:

      • 你应该在 php 中使用php.net/proc_open 并且很可能在 erl.erl 中与其他 erlang 节点进行通信,但我认为你可以自己完成 :)
      • 这要慢得多,因为每次都必须编译 escript。此外,每次都必须生成一个 shell 命令。
      • 你可以用编译好的erlang应用替换escript,只需“erl -run module function args”。并且每个 php 脚本都会生成一次程序,而不是那么多。
      • 与其说是生产解决方案,不如说是概念证明。对于生产,我认为可以使用一些接口,如 dbus 或 zeroMQ(zeromq.org/bindings:erlangzeromq.org/bindings:php
      【解决方案4】:

      看看erl_callhttp://www.erlang.org/doc/man/erl_call.html

      这是一个unix程序,用于调用erlang中的函数。它将启动一个虚拟 erl 节点,执行命令并返回结果。您可以使用 PHP 调用 erl_call,然后使用它返回的结果。

      【讨论】:

        【解决方案5】:

        我认为没有更好的解决方案。 我需要 Erlang 网络服务器才能在网络上运行它。 这是一些与 PHP+Erlang 相关的信息

        http://yaws.hyber.org/cgi.yaws

        【讨论】:

        • 我不需要使用 erlang server(yaws) 来服务 php。我使用 apache 为我的 php 提供服务,但希望能够从 php 脚本调用 erlang 函数。
        猜你喜欢
        • 1970-01-01
        • 2011-02-24
        • 2017-04-20
        • 2010-12-30
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        相关资源
        最近更新 更多