【问题标题】:Connect PHP code to Java backend将 PHP 代码连接到 Java 后端
【发布时间】:2010-10-27 20:55:50
【问题描述】:

我正在实现一个网站,前端使用 PHP,后端使用 Java 服务。两部分如下:

  1. PHP前端监听http请求并与数据库交互。

  2. Java 后端持续运行并响应来自前端的调用。

更具体地说,后端是一个守护进程,它连接并维护与多个 IM 服务(AOL、MSN、Yahoo、Jabber...)的链接。

这两层将部署在同一个系统上(我想是 CentOS 机器),并且引入中间层(例如:使用 XML-RPC)会降低性能(资源也相当有限)。

问题:有没有办法直接链接两个层? (中间不再有网络服务)

【问题讨论】:

    标签: java php service native daemon


    【解决方案1】:

    由于这是两个独立运行进程之间的通信,因此不可能进行“直接”调用(如JNI)。进行此类进程间通信的最简单方法可能是named pipes 和网络套接字。在这两种情况下,您都必须定义一个通信协议并在双方实现它。使用 XML-RPC 之类的标准协议可以使这更容易,但并非绝对必要。

    【讨论】:

      【解决方案2】:

      应用程序集成通常有四种模式:

      1. 通过文件系统,即。一个生产者将数据写入消费者监控的目录
      2. 通过数据库,即。两个应用程序共享一个模式或表并使用它来交换数据
      3. 通过 RMI/RPC/Web 服务/任何阻塞,将调用从一个应用程序同步到另一个应用程序。对于 PHP 到 Java,您可以从上面列出的各种集成库中进行选择,或者使用一些 Web 服务标准,例如 SOAP。
      4. 通过消息传递/任何非阻塞异步操作,其中一个应用向另一个应用发送消息。

      这些模式中的每一个都有优点和缺点,但一个好的经验法则是选择具有最松散耦合的模式,你可以摆脱它。例如,如果您选择 #4,您的 Java 应用程序可能会崩溃,而不会关闭您的 PHP 应用程序。

      在查看此处答案中列出的特定库或技术之前,我建议您选择适合自己的模式,然后调查您的具体选项。

      【讨论】:

        【解决方案3】:

        我已经尝试过 PHP-Java 桥(php-java-bridge.sourceforge.net/pjb/),它工作得很好。基本上,我们需要运行一个 jar 文件(JavaBridge.jar)来监听端口(有几个可用的选项,如本地套接字、8080 端口等)。您的 java 类文件必须可用于类路径中的 JavaBridge。您需要在您的 php 中包含一个文件 Java.inc 并且您可以访问 Java 类。

        【讨论】:

          【解决方案4】:

          当然,有很多方法,但你说的资源有限......

          恕我直言,定义您自己的轻量级 RPC 类协议并使用 TCP/IP 上的套接字进行通信。实际上,在这种情况下,不需要使用 RPC 等的全部优势......您只需要为这种特殊情况定义 API 并在双方都实现它。在这种情况下,您可以将数据包序列化为非常小的。您甚至可以为您的远程方法分配一种 GUID,并使用它们来节省流量并加快您的相互通信。

          使用套接字的优点是您的解决方案将具有相当大的可扩展性。

          【讨论】:

            【解决方案5】:

            你可以试试PHP/Java integration

            此外,如果通信是单向的(例如“发送 IM 邮件”),您可以将 PHP 请求写入文件并在 Java 应用程序中对其进行监控。

            【讨论】:

            • 通信实际上是双向的。然而,即使这是一种方式,我们仍然需要处理文件锁定。它可以通过使用命名管道来解决,但这仍然被认为是中间层。
            • 来自简介:“警告:这个扩展是实验性的。这个扩展的行为,包括它的函数名称和任何其他围绕这个扩展的文档可能会在 PHP 的未来版本中更改,恕不另行通知。这个使用扩展名应由您自担风险。”
            • 它已经进行了几年的实验 - 我将其读作“废弃”。无论如何,它是一个中间层 - 我不确定是否真的可以直接制作 Java 和 PHP 接口而不使用 a) 使用一些中间层或 b) 编写自己的。
            【解决方案6】:

            我最近也遇到了这个问题。上面的 Resin 解决方案实际上是沿 JRuby、Jython 和 Rhino 的路线用 Java 完全重写 PHP。它被称为栎树。但我猜你和我一样,扔掉你的 Apache/PHP 设置并不是一个真正的选择。

            除此之外,Quercus 还存在更多问题:免费版本是 GPL,如果您正在开发商业软件,这会很棘手(尽管不像 Resin 希望您相信的那么棘手(但 IANAL)),除此之外免费版不支持编译成字节码,所以它基本上是一个用Java编写的解释器。

            我最终决定只是通过 HTTP 交换简单的消息。我使用 PHP 的 json_encode()/json_decode() 和 Java 的 json-lib 将消息编码为 JSON(简单,基于文本,非常适合数据模型)。

            另一个有趣且轻量级的选项是让 Java 生成 PHP 代码,然后使用 PHP include() 指令通过 HTTP 获取并执行它。不过我没试过。

            如果它是您关心的实际 HTTP 调用(出于性能考虑),那么这些解决方案都无济于事。我只能说我在同一个 LAN 上没有遇到 PHP 和 Java 的问题。我的感觉是,只要你的 RPC 调用相当粗略(无论如何你真的应该这样做),这对绝大多数应用程序来说都不是问题。

            【讨论】:

            • 当 Java 生成你的 PHP 代码时,每次运行时生成的 PHP 代码都会不同。因此,根据 PHP 操作码缓存的具体工作方式,此解决方案对禁用 PHP 缓存(APC、eAccelerator 等)有很大的更改,因此会降低包含此 java 生成的 PHP 代码的所有脚本的性能。
            【解决方案7】:

            抱歉,这个回答有点快但是:我听说 Resin 应用服务器支持集成 java 和 PHP。

            他们声称他们可以将php和java结合在一起:http://www.caucho.com/resin-3.0/quercus/

            我使用resin 为J2ee 应用程序提供服务,但不是为了它的PHP 支持。

            我很想听听这样的冒险。

            【讨论】:

              【解决方案8】:

              为什么不使用网络服务?

              创建一个 Java 层并放置一个 ws 访问(Axis、SpringWS 等),然后 Php 使用一个 ws 客户端访问 Java 层。

              我认为它简单实用。

              【讨论】:

              • 我想要一些非常简单的东西。对于资源有限的 VPS(大约 256MB 的 RAM),使用 ws 进行 10 个连接是可以的,但是 1000 个连接会成为一个大问题。以最低成本考虑可扩展性。
              【解决方案9】:

              我遇到了这个页面,它介绍了一种链接两个层的方法。但是,它仍然需要一个中间层(TCP/IP)。此外,其他服务也可能会利用 Java 服务,因为它接受所有传入连接。

              http://www.devx.com/Java/Article/20509

              [正在研究...]

              【讨论】:

              • 您应该编辑您的问题而不是回答它。正如我所写,如果没有某种中间层,两个独立的进程就不可能进行通信。至于从外部访问,这就是防火墙的作用,但命名管道不会出现这个问题。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多