将PHP代码连接到Java后端

时间:2009-05-21 08:17:54

标签: java php service native daemon

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

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

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

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

    两个层都将部署在同一个系统上(我认为是CentOS盒),引入中间层(例如:使用XML-RPC)会降低性能(资源也相当有限)。 / p>

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

9 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

  1. 通过Filesystem,即。一个生产者将数据写入消费者监控的目录
  2. 通过数据库,即。两个应用程序共享一个模式或表,并使用它来交换数据
  3. 通过RMI / RPC /网络服务/任何阻止,从一个应用程序同步到另一个应用程序。对于PHP到Java,您可以从上面列出的各种集成库中选择,或者使用一些Web服务标准,如SOAP。
  4. 通过短信/任何非阻止,异步操作,其中一个应用向另一个应用发送消息。
  5. 这些模式中的每一种都有利有弊,但一个好的经验法则是挑选一个你可以逃脱的最松散的耦合。例如,如果您选择了#4,那么您的Java应用程序可能会崩溃而不会删除您的PHP应用程序。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

套接字使用的优势在于您的解决方案具有相当的可扩展性。

答案 4 :(得分:1)

您可以尝试PHP/Java integration

此外,如果通信是单向的(类似“sendmail for IM”),您可以将PHP请求写出来并在Java应用程序中监视该文件。

答案 5 :(得分:1)

我最近也遇到过这个问题。上面的Resin解决方案实际上是一个完整的Java重写,与JRuby,Jython和Rhino一致。它被称为栎属。但我猜测你是因为它对我来说,抛弃你的Apache / PHP设置并不是一个真正的选择。

此外Quercus还存在更多问题:免费版本是GPL,如果你正在开发商业软件(虽然不像Resin想要你相信(但IANAL)那么棘手)并且除此之外还很棘手免费版本不支持编译为字节代码,因此它基本上是用Java编写的解释器。

我最终决定只是通过HTTP交换简单的消息。我使用PHP的json_encode() / json_decode()和Java的json-lib来编码JSON中的消息(简单,基于文本,与数据模型匹配良好)。

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

如果您关注的是实际的HTTP调用(性能),这些解决方案都不会对此有所帮助。我只能说我在同一局域网上没有PHP和Java的问题。我的感觉是,对于绝大多数应用程序来说,只要你保持你的RPC调用相当粗略(你真的应该这样做),它就不会成为问题。

答案 6 :(得分:0)

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

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

我使用树脂来提供J2ee应用程序,但不支持PHP支持。

我很想知道这样的冒险经历。

答案 7 :(得分:0)

为什么不使用网络服务?

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

我认为这很简单实用。

答案 8 :(得分:-1)

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

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

[研究...]