将PHP代码连接到Java后端

将PHP代码连接到Java后端,java,php,service,native,daemon,Java,Php,Service,Native,Daemon,我正在实现一个网站,前端使用PHP,后端使用Java服务。这两部分内容如下: PHP前端侦听http请求并与数据库交互 Java后端持续运行并响应前端的调用 更具体地说,后端是一个守护进程,用于连接和维护到多个IM服务(AOL、MSN、Yahoo、Jabber…)的链接 这两个层将部署在同一个系统上(我想是CentOS机箱),引入中间层(例如:使用XML-RPC)将降低性能(资源也相当有限) 问:有没有办法将这两层直接连接起来?(中间不再有web服务)您可以尝试 此外,如果通信是单向的(类似于“

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

  • PHP前端侦听http请求并与数据库交互

  • Java后端持续运行并响应前端的调用

  • 更具体地说,后端是一个守护进程,用于连接和维护到多个IM服务(AOL、MSN、Yahoo、Jabber…)的链接

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

    问:有没有办法将这两层直接连接起来?(中间不再有web服务)

    您可以尝试


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

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

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


    [正在研究…]

    我尝试了PHP Java桥(PHP Java bridge.sourceforge.net/pjb/),效果非常好。基本上,我们需要运行一个jar文件(JavaBridge.jar),它监听端口(有几个选项可用,比如本地套接字、8080端口等等)。java类文件必须可用于类路径中的JavaBridge。您需要在php中包含一个文件Java.inc,然后才能访问Java类。

    当然,有很多方法,但是您提到了有限的资源

    IMHO定义自己的轻量级RPC协议,并使用TCP/IP上的套接字进行通信。实际上,在这种情况下,没有必要充分利用RPC等的优点。。。您只需要为这种特殊情况定义API并在两侧实现它。在这种情况下,您可以将数据包序列化为非常小的数据包。您甚至可以为远程方法分配一种guid,并使用它们来节省通信量和加快内部通信


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

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

  • 通过文件系统,即生产者将数据写入消费者监控的目录
  • 通过数据库,即两个应用程序共享一个模式或表,并使用它交换数据
  • 通过RMI/RPC/web服务/任何阻止,从一个应用程序到另一个应用程序的同步调用。对于PHP到Java,您可以从上面列出的各种集成库中选择,或者使用一些web服务标准,如SOAP
  • 通过消息传递/一个应用程序向另一个应用程序发送消息的任何非阻塞异步操作
  • 每种模式都有其优缺点,但一个好的经验法则是选择一种耦合最松的模式。例如,如果您选择了#4,您的Java应用程序可能会崩溃,而不会同时关闭PHP应用程序


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

    对不起,这是一个有点简单的答案,但是:我听说Resin app server支持集成java和PHP

    他们声称他们可以将php和java结合在一起:

    我使用了resin来服务J2ee应用程序,但没有使用它的PHP支持


    我很想听到这样的冒险故事。

    为什么不使用web服务呢

    创建一个Java层并放置一个ws-access(Axis、SpringWS等),Php使用一个ws-client访问Java层


    我认为它简单而有用。

    我最近也遇到了这个问题。上面的树脂解决方案实际上是在Java中按照JRuby、Jython和Rhino的思路完全重写PHP。它叫栎树。但我猜你和我一样,放弃Apache/PHP设置并不是一个真正的选择

    此外,Quercus还有更多的问题:免费版本是GPL,如果你正在开发商业软件(虽然没有Resin希望你相信的那么复杂(但是IANAL)),这是很棘手的,而且免费版本不支持编译成字节码,所以它基本上是用Java编写的解释器

    我最终决定只通过HTTP交换简单的消息。我使用PHP的
    json_encode()
    /
    json_decode()
    和Java的代码对json中的消息进行编码(简单、基于文本、与数据模型非常匹配)

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


    如果您关心的是实际的HTTP调用(为了性能),那么这两种解决方案都不会有帮助。我所能说的是,我在同一个局域网上使用PHP和Java时没有遇到任何问题。我的感觉是,对于绝大多数应用程序来说,这不会是一个问题,只要您使您的RPC调用具有相当的过程粒度(无论如何,您确实应该这样做)。

    通信实际上是双向的。然而,即使这是一种方法,我们仍然需要处理文件锁定。它可以通过使用命名管道来解决,但这仍然被认为是一个中间层。引言中写道:“警告:此扩展是实验性的。此扩展的行为包括其函数的名称和任何其他文档