我正在实现一个网站,前端使用 PHP,后端使用 Java 服务。两部分如下:
PHP 前端监听 http 请求并与数据库交互。
Java 后端持续运行并响应来自前端的调用。
更具体地说,后端是一个守护进程,它连接并维护与多个 IM 服务(AOL、MSN、Yahoo、Jabber...)的链接。
这两层将部署在同一个系统上(我想是 CentOS 机器),引入中间层(例如:使用 XML-RPC)会降低性能(资源也相当有限)。
问题:有没有办法直接链接两个层?(两者之间没有更多的网络服务)
应用程序集成通常有四种模式:
这些模式中的每一个都有优点和缺点,但一个好的经验法则是选择具有最松散耦合的模式,你可以摆脱它。例如,如果您选择#4,您的 Java 应用程序可能会崩溃,而不会同时关闭您的 PHP 应用程序。
在查看此处答案中列出的特定库或技术之前,我建议您为自己选择正确的模式,然后调查您的特定选项。
我已经尝试过 PHP-Java 桥(php-java-bridge.sourceforge.net/pjb/),它工作得很好。基本上,我们需要运行一个 jar 文件(JavaBridge.jar)来监听端口(有几个可用的选项,如本地套接字、8080 端口等)。您的 java 类文件必须可用于类路径中的 JavaBridge。您需要在您的 php 中包含一个文件 Java.inc 并且您可以访问 Java 类。
当然,有很多方法,但你说的资源有限......
恕我直言,定义您自己的轻量级类 RPC 协议并使用 TCP/IP 上的套接字进行通信。实际上,在这种情况下,不需要使用 RPC 等的全部优势......您只需要为这种特殊情况定义 API 并在双方都实现它。在这种情况下,您可以将数据包序列化为非常小的。您甚至可以为您的远程方法分配一种 GUID,并使用它们来节省流量并加速您的互通。
使用套接字的优点是您的解决方案将具有相当大的可扩展性。
我最近也面临这个问题。上面的 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 调用相当粗略(无论如何您都应该这样做),这对于绝大多数应用程序来说都不是问题。
您可以尝试PHP/Java 集成。
此外,如果通信是单向的(例如“发送 IM 邮件”),您可以将 PHP 请求写入文件并在 Java 应用程序中对其进行监控。
抱歉,这是一个快速的回答,但是:我听说 Resin 应用服务器支持集成 java 和 PHP。
他们声称他们可以一起粉碎 php 和 java:http: //www.caucho.com/resin-3.0/quercus/
我使用resin 为J2ee 应用程序提供服务,但不是为了它的PHP 支持。
我很想听听这样的冒险。
为什么不使用网络服务?
创建一个 Java 层并放置一个 ws 访问(Axis、SpringWS 等),然后 Php 使用一个 ws 客户端访问 Java 层。
我认为它简单而有用。
我遇到了这个页面,它介绍了一种链接两个层的方法。但是,它仍然需要一个中间层(TCP/IP)。此外,其他服务也可以利用 Java 服务,因为它接受所有传入连接。
http://www.devx.com/Java/Article/20509
[研究中……]