7

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

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

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

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

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

问题:有没有办法直接链接两个层?(两者之间没有更多的网络服务)

4

9 回答 9

9

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

于 2009-05-21T08:37:47.227 回答
4

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

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

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

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

于 2009-05-21T12:29:18.630 回答
3

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

于 2009-05-21T09:06:26.637 回答
2

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

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

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

于 2009-05-21T11:58:18.227 回答
1

我最近也面临这个问题。上面的 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 调用相当粗略(无论如何您都应该这样做),这对于绝大多数应用程序来说都不是问题。

于 2009-10-29T22:52:17.463 回答
1

您可以尝试PHP/Java 集成

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

于 2009-05-21T08:33:14.207 回答
0

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

他们声称他们可以一起粉碎 php 和 java:http: //www.caucho.com/resin-3.0/quercus/

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

我很想听听这样的冒险。

于 2009-05-21T12:34:47.217 回答
0

为什么不使用网络服务?

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

我认为它简单而有用。

于 2009-05-21T15:56:53.220 回答
-1

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

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

[研究中……]

于 2009-05-21T08:38:41.200 回答