我正在实现一个使用PHP作为前端和一个Java服务作为后端的网站。这两部分如下:
PHP前端侦听http请求并与数据库进行交互。
Java后端持续运行并响应来自前端的呼叫。
更具体地说,后端是一个守护进程,它连接并维护到多个IM服务(AOL,MSN,Yahoo,Jabber ......)的链接。
两个层都将部署在同一个系统上(我认为是CentOS盒),引入中间层(例如:使用XML-RPC)会降低性能(资源也相当有限)。 / p>
问题:有没有办法直接链接这两个层? (中间没有更多的网络服务)
答案 0 :(得分:9)
由于这是两个独立运行进程之间的通信,因此无法进行“直接”调用(如JNI)。进行此类进程间通信的最简单方法可能是named pipes和网络套接字。在这两种情况下,您都必须定义通信协议并在两端实现它。使用标准协议(如XML-RPC)可以使这更容易,但并非绝对必要。
答案 1 :(得分:4)
应用程序集成通常有四种模式:
这些模式中的每一种都有利有弊,但一个好的经验法则是挑选一个你可以逃脱的最松散的耦合。例如,如果您选择了#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
[研究...]